2017-06-27 78 views
0

我想用Moq來模擬向存儲庫添加元素,然後檢查已插入元素的數量,但它總是給我0個元素,在我的代碼中出現錯誤,你能請幫幫我?Moq知識庫返回0個項目

var candidate = new Candidate { Id = Guid.NewGuid()};    
var repo = new Mock<ICandidateRepository<Candidate>>(); 
repo.Setup(x => x.Insert(candidate)); 
repo.Setup(x => x.Submit()); 

candidateBL.setRepository(repo.Object); 
MinifiedCount<MinifiedCandidate> result = candidateBL.Get(username, skip, take, id); 

inside candidateBL我檢查了存儲庫變量,並有0個元素。

謝謝。

+0

什麼是'candidateBL'?你可以分享'candidateBL.Get'方法的代碼嗎? –

+0

它太長,並沒有真正幫助解決這個問題,我評論了我設置存儲庫的路線,它給了我5個元素,但我想使用一個模擬存儲庫...非常感謝你@ChetanRanpariya – TiagoM

+0

我希望你'不希望'Insert'和'Submit'調用將'candidate'放入某個倉庫... –

回答

2

如果沒有看到更多的代碼,我相當確信你已經陷入了陷入陷阱,認爲模擬界面的某種模式與它的實現有關。

換句話說,它看起來像你認爲這個代碼實際上將插入candidate到你的資料庫:

repo.Setup(x => x.Insert(candidate)); 
repo.Setup(x => x.Submit()); 

如果這是你的理解,這不是在所有的情況。上面的代碼告訴你的模擬期望Insert打電話與指定的Candidate實例,也期望呼叫Submit。模擬對象的方法有沒有實現;他們按照Setup的方法完成了你告訴他們要做的事情。

而不是像對待實際的實現那樣對待模擬,您需要告訴它如何在您的代碼被測試時使用響應。例如,假設你candidateBL.Get方法是簡單的東西是這樣的:

public Candidate Get(Guid id) 
{ 
    try 
    { 
     return _repository.Find(id); 
    } 
    catch (KeyNotFoundException) 
    { 
     return null; 
    } 
} 

現在想象你正在測試這種方法。在簡單情況下,這裏有兩個測試用例:其中一個在存儲庫中找到單個Candidate並返回,另一個在存儲庫拋出(id不存在)。您需要設置模擬以在每個測試中反映這些情況。

第一個測試將設立倉庫模擬如下:

var repo = new Mock<ICandidateRepository<Candidate>>(); 
repo.Setup(x => x.Find(candidate.Id)).Returns(candidate)); 

注意,沒有哪裏我插入的候選人;當我用特定的標識符呼叫Find時,我反而告訴模擬器將它還給我。

以及物品是否完整,第二個測試將設置它拋出:

var repo = new Mock<ICandidateRepository<Candidate>>(); 
repo.Setup(x => x.Find(candidate.Id)).Throws(new KeyNotFoundException())); 
+0

您好@PatrickQuirk我的Get方法是巨大的,它在開始時進行選擇,然後使用Where表達式篩選元素( LINQ)。我不能測試自己的Get方法嗎? – TiagoM

+0

嘿@PatrickQuirk我注意到,做這個測試假設該候選版.Id已經存在版本庫的權利?我想做一個乾淨的存儲庫並在那裏插入元素,然後使用所有可選參數測試Get方法,以便接收存儲庫中的所有元素 – TiagoM