我正在使用xUnit.net和Moq开始进行单元测试。我正在编写一个针对AppService
中Update()
方法的测试方法:
public class AppService : IAppService
{
public virtual void Update(App entity)
{
if (entity == null)
{
throw new ArgumentNullException("App");
}
_appRepository.Update(entity);
_cacheManager.Remove(Key);
}
}
_appRepository
和 _cacheManager
分别基于接口 IRepository<App>
和 ICacheManager
。在我的单元测试中,我使用 moq 来创建这些对象的模拟实例,如下所示:
[Fact]
public void UpdateTest()
{
mockAppRepository = new Mock<IRepository<App>>();
mockCacheManager = new Mock<ICacheManager>();
// how to setup mock?
// mockAppRepository.Setup();
AppService target = new AppService(mockAppRepository.Object,
mockCacheManager.Object);
App entity = new App();
target.Update(entity);
Assert.NotNull(entity);
}
我知道我需要模拟存储库更新成功的情况,特别是调用_appRepository.Update(entity);
我的问题是,最好的方法是什么? 当我在mockAppRespository
上调用Setup()
时,我是否应该只使用回调方法?创建一个虚构的集合并将期望设置为修改虚构集合的更新方法是否是标准做法?