2017-01-18 11 views
0

В моем новом проекте .Net Core я решил использовать инфраструктуру Moq в первый раз. После того, как я создал весь метод в соответствии с уроком я все еще получаю исключение:Mocked method по-прежнему возвращает null

"The following setups were not matched: IRepository`1 cr => cr.GetSingle(x => x.Key == 7028750f-044c-4862-999d-e21c4bfe7543) "

или после удаления всех VerifyAll() вызывает, приобретаемый нуль из Serivice. Любая идея, как ее решить?

: Зависимости

  • "Microsoft.NETCore.App": "1.1.0",
  • "Moq": "4.6.38-альфа",
  • "XUnit": «2.2 0,0-beta5-build3474" ,
  • "DotNet-тест-XUnit": "2.2.0-preview2-build1029",

Характер:

public class Character : IEntity 
{ 
    ... 
    public Guid Key { get; set; } 
    ... 
} 

Generic хранилище:

public interface IRepository<TEntity> where TEntity : class, IEntity 
{ 
    TEntity GetSingle(Expression<Func<TEntity, bool>> predicate); 
    ... 
} 

Единица работы:

public interface IUnitOfWork 
{   
    IRepository<TEntity> Repository<TEntity>() where TEntity : class, IEntity;  
    ... 
} 

Символов службы:

class CharactersService : ICharactersService 
{ 
    private readonly IUnitOfWork _unitOfWork; 

    public CharactersService(IUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 

    public Character GetCharacterByKey(Guid characterKey) 
    { 
     var charactersRepository = _unitOfWork.Repository<Character>(); 
     var character = charactersRepository.GetSingle(ch => ch.Key == characterKey); 
     return character; 
    } 
    ... 
} 

испытаний Класс:

public class CharactersServiceTest 
{ 
    [Fact] 
    public void GetCharacterByKey_CharacterExists_ReturnsCharacter() 
    { 
     //Arrange 
     var guid = Guid.NewGuid(); 
     var characterFromDb = new Character { Key = guid }; 

     var characterRepositoryMock = new Mock<IRepository<Character>>(); 
     characterRepositoryMock.Setup(cr => cr.GetSingle(x => x.Key == guid)).Returns(characterFromDb); 
     characterRepositoryMock.VerifyAll(); 

     var unitOfWorkMock = new Mock<IUnitOfWork>(); 
     unitOfWorkMock.Setup(uow => uow.Repository<Character>()).Returns(characterRepositoryMock.Object); 
     unitOfWorkMock.VerifyAll(); 

     var charactersService = new CharactersService(unitOfWorkMock.Object); 

     //Act 
     var character = charactersService.GetCharacterByKey(guid); 

     //Assert 
     Assert.NotNull(character); 
    } 
} 
+3

Я уверен, что вы должны позвонить VerifyAll * после завершения теста, чтобы убедиться, что ваши ожидания были выполнены во время теста ... – Will

+0

Я согласен с @Will, метод VerifyAll используется для убедитесь, что все ожидания были выполнены для этого издевающегося класса. Таким образом, любые методы, которые вы настроили, вы, возможно, захотите проверить, что они были вызваны правильно, поэтому функция VerifyAll является помощником, поэтому вам не нужно вызывать ее для каждой проверки, которую вы хотите сделать. –

+0

Возможный дубликат [Настройка и проверка выражения с помощью Moq] (http://stackoverflow.com/questions/17570761/setup-and-verify-expression-with-moq) –

ответ

1

Проблема здесь в том, что вы сравниваете два выражения:

Первые в characterRepositoryMock.Setup: x => x.Key == guid
И второй один в GetCharacterByKey Метод: ch => ch.Key == characterKey

Они не идентичны, поскольку они указывают на два различных выражения объекты. Если вы действительно хотите, чтобы проверить его таким образом, вы должны проверить, что оба выражения получить то же GUID значения:

characterRepositoryMock.Setup(cr => 
    cr.GetSingle(It.Is<Expression<Func<Character, bool>>>(x =>check(x, guid)))) 
.Returns(characterFromDb); 

С помощью этого метода проверки:

public bool check(Expression<Func<Character,bool>> x, Guid guid) 
{ 
    var body = x.Body as BinaryExpression; 
    var g = (Guid) Expression.Lambda(body.Right).Compile().DynamicInvoke(); 
    return g == guid; 
} 

И, да я согласен с комментариями , VerifyAll следует называть после все, в разделе Assert.

+0

'VerifyAll()' ничего вам не сделает, если вы не положили '.Подтверждаемый() 'в ваших установках. –

 Смежные вопросы

  • Нет связанных вопросов^_^