如何为仓库更新方法编写单元测试?

3

我正在使用xUnit.net和Moq开始进行单元测试。我正在编写一个针对AppServiceUpdate()方法的测试方法:

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()时,我是否应该只使用回调方法?创建一个虚构的集合并将期望设置为修改虚构集合的更新方法是否是标准做法?

1个回答

4
通常这样简单的测试就足够了。
mockAppRepository.Verify(d=> d.Update(It.IsAny<App>()), Times.Once());

使用Moq进行测试时,只有当返回结果很重要时才需要像这样进行设置: .Setup()。
编辑:
为了说明如何抛出异常(如评论所述),在运行代码之前,您需要进行以下设置。
mockAppRepository.Setup(d=> d.Update(It.IsAny<App>())).Throws<Exception>();

谢谢,那是我的原始想法,但似乎应该有更多的东西。 - Michael Hornfeck
通常,您还会设置一个测试,其中存储库更新引发异常? - Michael Hornfeck
1
@mhornfeck:我也会设置一个异常处理。 - Gilles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接