i am new on mock and i am trying to do this mock example :
Repository.cs
public class Repository : IRepository
{
public List<Person> GetForExpression(Expression<Func<Person,bool>> expression )
{
... //get person from orm using expression
}
}
PersonService.cs
public class PersonService
{
private IRepository _repository;
public PersonService(IRepository repository)
{
_repository = repository;
}
public List<Person> GetAllPersonsWith18More()
{
var result = _repository.GetForExpression(x => x.Age > 18);
return result;
}
}
Test:
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var moqRepository = new Mock<IRepository>();
var service = new PersonService(moqRepository.Object);
Expression<Func<Person, bool>> criteria = y => y.Age 18;
moqRepository.Setup(x => x.GetForExpression(It.Is<Expression<Func<Person, bool>>>(y => y == criteria))).Returns(new List<Person>());
service.GetAllPersonsWith18More();
moqRepository.VerifyAll();
}
}
if i use this setup works: moqRepository.Setup(x => x.GetForExpression(It.IsAny>>())).Returns(new List());
but i want to use more specific criteria, this is only one example that i do to demonstrate what i need.
This example is not matching, can anyone help to understand why and solve this problem?
If it is needed to test delegates I usually apply them to any test object. In order to test PersonService I'd rather use the following code that contains examples of two tests.
[TestClass]
public class UnitTest2
{
private Mock<IRepository> moqRepository;
private PersonService service;
[TestInitialize]
public void TestInitialize()
{
moqRepository = new Mock<IRepository>();
service = new PersonService(moqRepository.Object);
}
[TestMethod]
public void TestMethod3()
{
// arrange
var persons = new List<Person>
{
new Person { Age = 0 },
new Person { Age = 1 },
new Person { Age = 17 },
new Person { Age = 18 },
new Person { Age = 19 },
new Person { Age = 100 }
};
moqRepository
.Setup(x => x.GetForExpression(It.IsAny<Expression<Func<Person, bool>>>()))
.Returns<Expression<Func<Person, bool>>>(expr => persons.Where(expr.Compile()).ToList());
// act
var result = service.GetAllPersonsWith18More();
// assert
moqRepository.VerifyAll();
result.Should().BeEquivalentTo(persons.Where(x => x.Age > 18));
}
[TestMethod]
public void TestMethod4()
{
// arrange
Expression<Func<Person, bool>> criteria = x => x.Age > 18;
moqRepository
.Setup(x => x.GetForExpression(It.IsAny<Expression<Func<Person, bool>>>()))
.Returns(new List<Person>())
.Callback<Expression<Func<Person, bool>>>(expr =>
{
var persons = new List<Person>
{
new Person { Age = 0 },
new Person { Age = 1 },
new Person { Age = 17 },
new Person { Age = 18 },
new Person { Age = 19 },
new Person { Age = 100 }
};
persons.Where(expr.Compile()).Should().BeEquivalentTo(persons.Where(criteria.Compile()));
});
// act
service.GetAllPersonsWith18More();
// assert
moqRepository.VerifyAll();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With