Проверка службы вызывает метод IRepository, который определен в IGenericRepository - PullRequest
0 голосов
/ 29 августа 2018

У меня есть сервис, скажем, Foo класс обслуживания.

public class FooService : IFooService
{
    private readonly IFooRepository _repository;
    private readonly ISomeService _eventService;

    public FooService(IFooRepository repository, ISomeService eventService)
    {
        _repository = repository;
        _someService = someService;
    }

    public IReadOnlyCollection<Foo> GetFoos(bool isDeleted = true)
    {
        var foos= _repository.GetList(x => x.IsDeleted == isDeleted).ToList();
        return !foos.Any() ? new List<Foo>(): foos;
    }

}

Вот IFooRepository

public interface IFooRepository : IGenericRepository<Foo>
{

}

а вот IGenericRepository

public interface IGenericRepository<T> where T: BaseEntity
{

    IReadOnlyCollection<T> GetList(Expression<Func<T, bool>> where, params Expression<Func<T, object>>[] nav);

}

В моем тесте я хочу убедиться, что GetFoos метод FooService вызывает GetList метод

Это то, что я пытался

[TestClass]
public class FooServiceTest
{
    private IQueryable<Foo> _foos;
    private Mock<IFooRepository> _fooRepository;
    private FooService _fooService;
    private Mock<ISomeService> _someService;
    [TestInitialize]
    public void SetUp()
    {

        _foos = new List<Foo>
        {
            new Foo
            {                  
                EmailId = "a@a.com",                  
                IsDeleted = false,                 
            },
            new Foo
            {                  
                EmailId = "a@a.com",                  
                IsDeleted = true,                 
            },       
        }.AsQueryable();           
    }

    [TestMethod]
    public void GetGetFoos_CallsGetList()
    {
        //Arrange
        var foos= _foos.Where(x => x.IsDeleted).ToList();    
        _fooRepository = new Mock<IFooRepository>();         
        _fooRepository.Setup(m => m.GetList(x => x.IsDeleted)).Returns(foos);
        _someServiceMock = new Mock<ISomeService>();
        _fooService = new FooService(_fooRepository.Object, _someServiceMock.Object);
        //Act
        _fooService.GetFoos(true);

        //Assert
        _fooRepository.Verify(m=>m.GetList(x=>x.IsDeleted), Times.Once());

    }
}

Но я получаю исключение аргумента null в следующей строке

var foos= _repository.GetList(x => x.IsDeleted == isDeleted).ToList();

Любая подсказка, почему это происходит, хотя я говорю Returns(foos) во время установки.

Кроме того, как мне проверить, был ли вызван метод интерфейса?

1 Ответ

0 голосов
/ 29 августа 2018

То, что происходит (скорее всего), это то, что Moq не может соответствовать Expression<Func<T, bool>>, когда вы делаете .Setup().

Таким образом, вместо этого вы можете использовать IsAny<>() подход:

_fooRepository.Setup(m => m.GetList(It.IsAny<Expression<Func<Foo, bool>>>())).Returns(foos);

Если вы хотите установить, в каком выражении передается выражение, попробуйте

Expression<Func<Foo, bool>> capturedExpression = null; 
_fooRepository.Setup(m => m.GetList(It.IsAny<Expression<Func<Foo, bool>>>()))
.Returns((Expression<Func<Foo, bool>> e ) => { capturedExpression = e; return foos; }); 
Assert.IsTrue(capturedExpression.Compile()(_foos[1])); 
Assert.IsFalse(capturedExpression.Compile()(_foos[0]));

, чтобы проверить, был ли вызван метод, вы также можете изменить его в последний раз:

_fooRepository.Setup(m => m.GetList(It.IsAny<Expression<Func<Foo, bool>>>()))
.Returns((Expression<Func<Foo, bool>> e ) => { capturedExpression = e; return foos; })
.Verifiable(); 

затем _fooRepository.Verify(m=>m.GetList(It.IsAny<Expression<Func<Foo, bool>>>()), Times.Once()); Однако, если он не вызывается, capturedExpression имеет значение null (этот метод известен как неявное утверждение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...