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

时间:2012-02-09 01:36:34

标签: unit-testing repository moq xunit.net

我开始使用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时,我应该使用回拨方法吗?是否标准创建虚拟集合并设置更新方法的期望以修改虚拟集合?

1 个答案:

答案 0 :(得分:4)

通常情况下,测试就像这样简单。

mockAppRepository.Verify(d=> d.Update(It.IsAny<App>()), Times.Once());

使用Moq,如果返回结果很重要,你只需要.Setup()这样的测试。

编辑:
为了说明抛出异常,根据注释,您将在运行代码之前进行以下设置。

mockAppRepository.Setup(d=> d.Update(It.IsAny<App>())).Throws<Exception>();