2009-02-09 71 views
3

我剛剛參與Moq和單元測試,所以請原諒我,如果這看起來很明顯(通過SO的快速搜索沒有告訴我這樣的事情) 。如何寫Moq和Linq-to-sql的CRUD單元測試

我有以下提議構件的接口:

void AddFeed(Feed feed); 

,我想編寫該功能的單元測試。測試類有一個起訂量庫聲明如下:

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(); 

我想你會想要然後有一個測試一些如下所示:

[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 2009-02-10 16:46:00