Как написать модульный тест для метода обновления хранилища? - PullRequest
3 голосов
/ 09 февраля 2012

Я начинаю с модульного тестирования с использованием 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 Ответ

4 голосов
/ 09 февраля 2012

Обычно такой простой тест, как этот.

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

С Moq вам нужно только .Setup () выполнить такой тест, если важен возвращаемый результат.

Редактировать:
Чтобы проиллюстрировать выбрасывание исключения, согласно комментариям, вы должны выполнить следующую настройку перед запуском кода.

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