Как написать модульные тесты CRUD для Moq и Linq-to-Sql - PullRequest
3 голосов
/ 09 февраля 2009

Я только участвую в Moq и модульном тестировании, так что простите, если это кажется очевидным (быстрый поиск в SO не показал мне ничего подобного).

У меня есть интерфейс со следующим предложенным членом:

void AddFeed(Feed feed);

То, что я хотел бы написать модульный тест для этой функциональности. Тестовый класс имеет репозиторий Moq, объявленный следующим образом:

static IFeedRepository MockFeedsRepository(params Feed[] feeds)
    {
        var mockFeedsRepository = new Moq.Mock<IFeedRepository>();
        mockFeedsRepository.Expect(x => x.Feeds).Returns((feeds.AsQueryable));

        return mockFeedsRepository.Object;
    }

Как изменить фиктивное объявление репозитория, чтобы включить это новое желаемое поведение, или я должен создать другой Moq (и как это будет сделано).

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

Большое спасибо,

KevDog

1 Ответ

9 голосов
/ 10 февраля 2009

Я также предполагаю, что вы будете использовать метод AddFeed, как этот

Feed myNewFeed = new Feed();
feedRepository.Add(myNewFeed);

и что вы этим не пользуетесь (плохой дизайн)

IFeedRepository feedRepository = new FeedRepository();
Feed myNewFeed = new Feed(feedRepository);
...
myNewFeed.Save();

Я собираюсь догадаться, что вы захотите провести тест примерно так:

[Test]
public void TheTest()
{
  IFeedRepository repository = MockFeedsRepository({feed1, feed2, feed3});
  Feed newFeed = new Feed();
  repository.Add(newFeed);
  Assert.AreEqual(4,repository.Count());
}

Если это так, то тест на самом деле не проверяет ничего, кроме вашей реализации фиктивного хранилища в памяти. Это то, что вам действительно нужно делать?

Я бы посоветовал вам вместо этого протестировать реализацию репозитория в L2Sql или проверить взаимодействие классов с интерфейсом IFeedRepository.

А если вы хотите проверить использование интерфейса IFeedRepository, просто сделайте что-нибудь простое, например

[Test]
public void TheTest()
{
      IFeedRepository repository = Moq.Mock<IFeedRepository>();
      Feed newFeed = new Feed();
      repository.Expect(r => r.Add(newFeed)); //no return as it's a void method
      //repository.Expect(r => r.Add(newFeed)).Throws(new ApplicationException()); --Test handing of exceptions

      //Code to hit the .Add() method

      //Assert the Add method was called.
}

Советы по подтверждению вызова метода см. В Использование Moq для определения, вызван ли метод

Надеюсь, это поможет

...