我剛切換到Moq並遇到問題。我正在測試一個創建業務對象的新實例的方法,通過用戶輸入值設置對象的屬性並調用一個方法(SaveCustomerContact)來保存新對象。業務對象作爲ref參數傳遞,因爲它通過遠程處理層。我需要測試傳遞給SaveCustomerContact的對象是否按照預期設置了其所有屬性,但是因爲它在控制器方法中實例化爲新的,所以我似乎無法這樣做。使用Moq驗證參考參數的值
public void AddContact() {
var contact = new CustomerContact() { CustomerId = m_model.CustomerId };
contact.Name = m_model.CustomerContactName;
contact.PhoneNumber = m_model.PhoneNumber;
contact.FaxNumber = m_model.FaxNumber;
contact.Email = m_model.Email;
contact.ReceiveInvoiceFlag = m_model.ReceiveInvoiceFlag;
contact.ReceiveStatementFlag = m_model.ReceiveStatementFlag;
contact.ReceiveContractFlag = m_model.ReceiveContractFlag;
contact.EmailFlag = m_model.EmailFlag;
contact.FaxFlag = m_model.FaxFlag;
contact.PostalMailFlag = m_model.PostalMailFlag;
contact.CustomerLocationId = m_model.CustomerLocationId;
RemotingHandler.SaveCustomerContact(ref contact);
}
這裏的測試:
[TestMethod()]
public void AddContactTest() {
int customerId = 0;
string name = "a";
var actual = new CustomerContact();
var expected = new CustomerContact() {
CustomerId = customerId,
Name = name
};
model.Setup(m => m.CustomerId).Returns(customerId);
model.SetupProperty(m => model.CustomerContactName, name);
model.SetupProperty(m => m.PhoneNumber, string.Empty);
model.SetupProperty(m => m.FaxNumber, string.Empty);
model.SetupProperty(m => m.Email, string.Empty);
model.SetupProperty(m => m.ReceiveInvoiceFlag, false);
model.SetupProperty(m => m.ReceiveStatementFlag, false);
model.SetupProperty(m => m.ReceiveContractFlag, false);
model.SetupProperty(m => m.EmailFlag, false);
model.SetupProperty(m => m.FaxFlag, false);
model.SetupProperty(m => m.PostalMailFlag, false);
model.SetupProperty(m => m.CustomerLocationId, 0);
remote
.Setup(r => r.SaveCustomerContact(ref actual))
.Callback(() => Assert.AreEqual(actual, expected));
target.AddContact();
}
這僅僅是最近許多嘗試得到阿霍德該參數的。作爲參考,實際值不會從其初始(構造)狀態改變。
移動目標調用失敗後的Assert.AreEqual(預期的,實際的)。如果我將.Verifiable()添加到設置而不是.CallBack,然後在目標之後調用remote.Verify(或者,我假設將模擬設置爲strict),它總是失敗,因爲我在測試中提供的參數不是與在控制器方法中創建的實例相同的實例。
我正在使用Moq 3.0.308.2。任何想法如何測試這將不勝感激。謝謝!
我想我不確定你會如何存根(儘管我對存根不瞭解太多)。你能詳細說明如何處理? – 2009-04-10 03:26:16
另外,儘管我在ref問題上同意你的意見,但這就是我們的遠程處理層的工作方式,我不願意開始包裝後端隨機位的先例,因此我可以更輕鬆地編寫測試。 – 2009-04-10 03:29:50