我开始使用xUnit.net和Moq进行单元测试。我正在为Update()
中的AppService
方法编写测试方法:
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);
我的问题是,最好的方法是什么?当我在Setup()
上拨打mockAppRespository
时,我应该使用回拨方法吗?是否标准创建虚拟集合并设置更新方法的期望以修改虚拟集合?
答案 0 :(得分:4)
通常情况下,测试就像这样简单。
mockAppRepository.Verify(d=> d.Update(It.IsAny<App>()), Times.Once());
使用Moq,如果返回结果很重要,你只需要.Setup()这样的测试。
编辑:
为了说明抛出异常,根据注释,您将在运行代码之前进行以下设置。
mockAppRepository.Setup(d=> d.Update(It.IsAny<App>())).Throws<Exception>();