如果沒有看到更多的代碼,我相當確信你已經陷入了陷入陷阱,認爲模擬界面的某種模式與它的實現有關。
換句話說,它看起來像你認爲這個代碼實際上將插入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()));
什麼是'candidateBL'?你可以分享'candidateBL.Get'方法的代碼嗎? –
它太長,並沒有真正幫助解決這個問題,我評論了我設置存儲庫的路線,它給了我5個元素,但我想使用一個模擬存儲庫...非常感謝你@ChetanRanpariya – TiagoM
我希望你'不希望'Insert'和'Submit'調用將'candidate'放入某個倉庫... –