2014-02-17 77 views
0

我想讓我的腦袋圍繞moq和mvc。我已經設置了一個moq併爲其添加了一個有效的安裝程序。添加一個方法來設置一個Moq測試

我的測試調用我的界面。

var id = 2; 
var customer = new Customer() 
{ 
    CustomerId = 2, 
    FirstName = "Tomas", 
    LastName = "Smith" 
}; 

var moq = new Mock<ICustomerRepository>(); 
moq.Setup(x => x.Find(id, 1234)) 
    .Returns(Task.FromResult(customer)); 

var controller = new MyController(moq.Object); 
var result = await controller.Get(id); 

現在,在我的獲取操作中,我打電話給我的存儲庫以獲取此案例中的一位客戶。但我需要傳入一個額外的參數,這是一個int

var customer = await _repository.FindAsync(customerid, GetSourceId()); 

我怎樣才能moq GetSourceId()返回一個int?而實際上並不需要調用我知道的方法,因爲它從請求頭中提取數據會失敗?

回答

1

如果GetSourceId()是在控制器上的方法,你就必須通過嘲笑構造:

// mock takes params of constructor args 
var ctlr = new Mock(Of MyController)(moq.Object); 
ctlr.Setup(i => i.GetSourceId()).Returns(5); 

var obj = ctlr.Object; 
var result = obj.Get(); 

我能那麼直接調用操作方法上的模擬,它調用的邏輯爲了我;我不需要在模擬上做一個明確的設置來調用原始方法。

+0

謝謝Brian。是的,我認爲會有這樣的缺點。 –

+0

對不起布賴恩我以爲我有,但我沒有。所以我使用類似於你的例子'var ctlr = new Mock (moq.Object); ctlr.Setup(i => i.GetSourceId())。設置GetSourceId。但是,我打算如何設置我想要調用的操作? –

+0

更正,我使用你的例子包含了一個上面的代碼片斷,這個代碼片段適用於我。調用對象的方法調用原始方法沒有問題。上述解決方案與我的幾乎完全相同。 –

0
var getSource = Mock<IYourInterfaceHere>(); 
getSource.Setup(x => x.GetSource(YourParams)).Returns(1); 

隨着起訂量,如果你要打電話給你的Get方法,你將需要檢查所有呼叫使用此Get方法的方法,並模擬所有的人,例如:

你的Get方法在裏面調用GetSource()和GetSource(),調用另一個名爲GetId()的方法,如果你想測試你的Get方法,你將需要模擬你的GetSource()和你的GetId() 。像級聯。

相關問題