2012-02-07 73 views
1

我試圖嘲笑調用存儲庫。我可以成功地做到這一點,當一個庫調用通過設置()返回的值返回:Moq:設置不返回值的方法

mock.Setup(m => m.Get(param)).Returns(new CustomObject()); 

然而,當我嘗試做同樣設置爲存儲庫調用,沒有返回值,起訂量拋出異常,並告訴我,這種方法從來沒有所謂的模擬ieExpected調用正好是1倍,但0次

準確地說,我這樣做:

mock.Setup(m => m.UpdateRepository(param1)); // UpdateRepository returns no value 
service.DoUpdate(param1); 
mock.Verify(m => m.UpdateRepository(param1), Times.Exactly(1)); 

注:DoUpdate方法只調用庫。 UpdateRepository(參數1);

我在這種情況下沒有正確使用Moq安裝嗎?有沒有不同的方法來返回沒有價值的安裝方法?

在此先感謝!

+1

你肯定DoUpdate實際上是調用UpdateRepository? – 2012-02-07 01:17:32

回答

0

嘗試使用可驗證:

mock.Setup(m => m.UpdateRepository(param1)).Verifiable(); 
+0

我沒看到mock.Expect通過Intellisense? (我正在使用Moq 4) – TeeZee 2012-02-07 17:09:16

+0

@TeeZee嘗試與設置 – 2012-02-07 17:17:41

3

你並不需要設置呼叫UpdateRepository。只需驗證一下。

鑑於這些類型:

public interface IRepository 
{ 
    void UpdateRepository(string value); 
} 

public class Service 
{ 
    public Service(IRepository repository) 
    { 
     _repository = repository; 
    } 

    public void DoUpdate(string value) 
    { 
     _repository.UpdateRepository(value); 
    } 

    private IRepository _repository; 
} 

您的測試方法可能如下:

const string param1 = "whatever"; 

var repoMock = new Mock<IRepository>(); 

var sut = new Service(repoMock.Object); 

sut.DoUpdate(param1); 

repoMock.Verify(x => x.UpdateRepository(param1), Times.Once()); 
+0

最佳答案IMO!在某些情況下,在調用之前使用Verify進行檢查也可能是一個好主意,它從來沒有被稱爲'Times.Never()'。這對確保只調用您的方法很有用。 – ForceMagic 2013-11-05 20:39:38

+0

@ForceMagic Never()'可以是有用的;儘管對過於嚴格的嘲笑保持謹慎。您希望自由地重構您的實現而不會破壞脆弱的測試。換句話說,只驗證你正在測試的具體行爲。 – TrueWill 2013-11-05 21:43:26