2014-08-31 22 views
0

我做出了務實的決定,讓我的存儲庫充當存儲庫和 嚴格的精簡服務層。如何測試該方法更新對象?

我想測試的存儲庫的一種方法是Add方法。它看起來像這樣:

public void Add(Post post) 
{ 
    post.Slug = SlugConverter.Convert(post.Title); 

    context.Posts.Add(post); 
    context.SaveChanges(); 
} 

我想特別測試的是,Add方法莫名其妙地更新特定職位的Slug財產。

我應該如何去測試這個?我不知道我應該給予什麼具體的SlugConverter已經充分測試。

回答

0

從您的描述我假設,無論何時添加郵政,你想確保Slug屬性被修改。您不在乎它是否被正確修改(換句話說,在使用SlugConverter進行轉換後它具有什麼價值,因爲如您所述,您已經擁有該部分),所有您關心的是它已被修改。

話雖如此,你就必須

[Test] 
public void EnsureSlugIsModifiedBeforeBeingSaved() 
{ 
    var post = new Post(); 
    var clonedPost = (Post)post.Clone(); 

    var myRepository = new MyRepository(); 

    myRepository.Add(post); 

    // at this point post should have been saved and Slug should have been modified. 
    Assert.AreNotEqual(clonedPost.Slug, post.Slug); 
} 
+0

你不能假設'Post'有一個工作的'克隆'方法。但是,您可以只存儲帖子的slu rather而不是克隆整個帖子。 – Chris 2014-08-31 17:08:57

+0

@Chris好點,但是我試圖給出一個想法,應該是測試者,而不是測試方法實現應該如何。 – Michael 2014-08-31 19:14:29

1

你必須使用一個模擬框架來測試此功能。使用Moq:

[Test] 
public void Add_PostIsValid_PostSlugIsUpdated() 
{ 
    var post = new Mock<Post>(); 
    post.Setup(x=>x.Title).Returns("Test"); 

    var myRepository = new MyRepository(); 

    myRepository.Add(post.Object); 

    post.VerifySet(pst => pst.Slug = SlugConverter.Convert(post.Title)); 
} 

也嘗試失去依賴關係,以進行更簡單和更強大的測試。將此代碼片段視爲僞代碼,因爲我現在無法訪問Visual Studio。

+0

這需要訪問數據庫。對'myRepository.Add(post.Object)'的調用將調用'SaveChanges()',它將在數據庫上執行SQL。我的意見是,你嘲笑錯誤的類 – 2014-08-31 17:44:12

+1

這是真的,「還嘗試失去依賴關係以實現更簡單和更強大的測試」部分解決了這個問題。我不認爲我在嘲笑錯誤的課程。 – brz 2014-08-31 17:47:12

+0

是的,上下文也應該被嘲笑(而不是)。而且我不確定你在這種情況下如何真正失去依賴。它的工作是將東西保存到數據庫中。您可以確保將數據庫上下文傳遞給構造函數,但它可能已經適用於我們所知道的一切,並且您無法比這更好。 – Chris 2014-08-31 22:39:17

相關問題