2009-02-09 4 views
3

Je viens de m'impliquer dans le test de Moq et d'unité, alors pardonnez-moi si cela semble évident (une recherche rapide à travers SO ne m'a rien montré de tel) .Comment écrire des tests d'unité CRUD pour Moq et Linq-to-Sql

J'ai une interface avec le membre proposé ce qui suit:

void AddFeed(Feed feed); 

que je voudrais écrire un test unitaire pour cette fonctionnalité. La classe de test a un Moq référentiel déclaré comme suit:

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

     return mockFeedsRepository.Object; 
    } 

Comment la déclaration de dépôt fictif être modifié pour inclure ce nouveau comportement souhaité ou devrais-je créer un autre Moq devrait (et comment serait-ce fait). Mon hypothèse est que, après avoir créé le simulacre, la dérivation du test unitaire sera beaucoup plus facile, mais les indices sont grandement appréciés.

Un grand merci,

KevDog

Répondre

9

Je suppose que vous utilisez la méthode AddFeed comme celui-ci

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

et que vous ne l'utilisez pas comme celui-ci (ce qui est mauvaise conception)

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

Je vais deviner que vous voudriez alors avoir un test quelque chose ing comme ceci:

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

Si tel est le cas, le test ne teste quoi que ce soit autre que votre mise en œuvre d'une maquette dépôt en mémoire. Est-ce ce que vous devez vraiment faire?

Je suggère que ce que vous voulez faire est de tester l'implémentation L2Sql du référentiel à la place, ou de tester comment les classes interagissent avec l'interface IFeedRepository.

Et si vous voulez tester l'utilisation de l'interface IFeedRepository puis faire juste quelque chose de simple comme

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

Pour obtenir des conseils sur l'affirmation si une méthode a été appelée, voir Using Moq to determine if a method is called

J'espère que cela aide

+0

Votre hypothèse sur la façon dont j'utilise la méthode AddFeed est correcte. J'ai fini par écrire un test pour les parties Linq-to-Sql, comme vous l'avez suggéré, car il semblait que je testais les mauvaises parties. Merci d'avoir éclairci ma confusion. – KevDog

Questions connexes