2009-02-09 1 views
3

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

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

void AddFeed(Feed feed); 

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

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

ответ

9

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

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

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

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

Я собираюсь предположить, что вы захотите, ING как это:

[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. 
} 

Советы по отстаиванию, если метод был вызван, см Using Moq to determine if a method is called

Я надеюсь, что помогает

+0

Ваше предположение о том, как я использую метод AddFeed, является правильным. В конце концов, я написал тест для частей Linq-to-Sql, как вы и предполагали, поскольку, как мне показалось, я тестировал неправильные детали. Спасибо, что поняли мое замешательство. – KevDog

Смежные вопросы