【发布时间】:2017-01-18 14:49:47
【问题描述】:
在我的新 .Net Core 项目中,我决定第一次使用 Moq 框架。根据教程设置所有方法后,我仍然收到异常:
或者在删除所有 VerifyAll() 调用后,a 从服务中获取 null。 知道如何解决吗?
依赖:
- “Microsoft.NETCore.App”:“1.1.0”,
- “起订量”:“4.6.38-alpha”,
- “xunit”:“2.2.0-beta5-build3474”,
- “dotnet-test-xunit”:“2.2.0-preview2-build1029”,
人物:
public class Character : IEntity
{
...
public Guid Key { get; set; }
...
}
通用存储库:
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);
}
}
【问题讨论】:
-
我很确定您应该在测试完成后调用VerifyAll,以验证您的期望在测试期间是否得到满足...
-
我同意@Will 的观点,
VerifyAll方法用于验证为该模拟类设置的所有期望值是否已得到满足。因此,您设置的任何方法都可能希望验证它是否已被正确调用,因此VerifyAll函数是一个帮助器,因此您不必为您希望进行的每个验证调用它。