AlM
AlM

Reputation: 21

How to xunit / Moq test an internal setter within a model in ASP.NET Core

public class Details
{
    public int Id { get; internal set; }
    public string Name { get; set; }
}

I have a task where a setter in a model has an internal attribute and I have tried adding stuff like

[assembly: InternalsVisibleTo("sometestrepo")] 

over the model class but to no avail. I googled for a couple of hours and I can't seem to find an answer. Is it even possible to xunit test it or mock and object so that it would allow to create an object with an Id. Otherwise how else am I supposed to fully test CRUD methods that are all based around ID parameter?

Upvotes: 0

Views: 1035

Answers (2)

Nope
Nope

Reputation: 22339

One solution that might work is to use a fake.

In your Test class create a fake Details class, inheriting from Details. Then you could new up the property.

public class FakeDetails : Details
{
    public new int Id { get; set; }
}

You could use the fake in your test then to set the properties.

var fakeDetails = new FakeDetails();
    
fakeDetails.Id = 15;
fakeDetails.Name = "Some Name";

Upvotes: 0

Pritom Sarkar
Pritom Sarkar

Reputation: 2252

The solution is to make private members that you want to test internal. then you can add InternalsVisibleTo attribute.

[assembly: InternalsVisibleTo("sometestrepo")]

if you're using Moq,You can use something like that:-

var mockAddress = new Mock<Details>();
mockAddress.SetupGet(p => p.Id).Returns(42);
mockAddress.SetupGet(p => p.Name).Returns("Whatever you want to match");

var mockAddressRepository = new Mock<IRepository<Details>>();
var addresses = new List<Details> { mockAddress.Object };
mockAddressRepository.Setup(p => p.GetEnumerator()).Returns(addresses.GetEnumerator());

var addressToMatch = mockAddressRepository.Object.FirstOrDefault(address => address.Id == 42);
Console.WriteLine(addressToMatch.Name);

Expected Output Is:-

Whatever you want to match

Upvotes: 1

Related Questions