我刚刚转换到Moq并遇到了一个问题。我正在测试一个方法,该方法创建一个新的业务对象实例,从用户输入值设置对象属性,并调用一个方法(SaveCustomerContact)来保存新对象。因为业务对象通过远程处理层传递,所以它作为ref参数传递。我需要测试传递给SaveCustomerContact的对象是否像预期设置了所有属性,但是因为它在控制器方法中被实例化为新对象,我似乎做不到。
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();
}
这只是尝试获取该参数的最新尝试之一。 值得参考的是,actual的值不会从其初始(构造)状态更改。
将Assert.AreEqual(expected, actual)移动到目标调用后会失败。 如果我在设置中添加.Verifiable()而不是.CallBack并在目标之后调用remote.Verify(或者,我假设,将模拟设置为严格模式),则始终会失败,因为我在测试中提供的参数与在控制器方法中创建的实例不同。
我正在使用Moq 3.0.308.2。 任何有关如何测试这个问题的想法都将不胜感激。 谢谢!