Вам нужно сделать метод Repository<T>.Get
виртуальным, чтобы Moq мог его переопределить и вернуть значение, которое вы установили:
public virtual T Get(Expression<Func<T, bool>> predicate)
и в своем тесте измените
mock.Setup(x => x.Get(z => z.CustomerId == customerId))
.Returns(new Customer());
на
mock.Setup(x => x.Get(It.IsAny<Expression<Func<Customer, bool>>>()))
.Returns(new Customer());
, где указано возвращать новый Customer
для любого переданного Expression<Func<Customer, bool>>
. В идеале вы должны проверить определенное выражение, но согласно принятому ответу на этот SO вопрос ,Moq не может этого сделать.
Если вы хотите проверить, что ваш уровень обслуживания не делал ничего неожиданного для Customer
, возвращаемого хранилищем, вместо того, чтобы проверить, что any Customer
было возвращено, вы можете настроить макет Customer
(обязательно сделав свойство CustomerId
виртуальным) и утверждать, что Customer
, возвращаемый сервисным уровнем, имеет ожидаемые свойства.
[TestMethod]
public void GetCustomerTest()
{
const int customerId = 5;
var mockCustomer = new Mock<Customer>();
mockCustomer.SetupGet(x => x.CustomerId)
.Returns(customerId);
var mock = new Mock<IRepository<Customer>>();
mock.Setup(x => x.Get(It.IsAny<Expression<Func<Customer, bool>>>()))
.Returns(mockCustomer.Object);
var repository = mock.Object;
var service = new CustomerService(repository);
var result = service.GetCustomerById(customerId);
Assert.AreEqual(customerId, result.CustomerId);
}
НТН