Acabo de cambiar a Moq y me he encontrado con un problema. Estoy probando un método que crea una nueva instancia de un objeto comercial, establece las propiedades del objeto a partir de los valores de entrada del usuario y llama a un método (SaveCustomerContact) para guardar el nuevo objeto. El objeto comercial se pasa como argumento de ref porque atraviesa una capa remota. Necesito probar que el objeto que se pasa a SaveCustomerContact tiene todas sus propiedades configuradas como se esperaba, pero dado que se instancia como nuevo en el método del controlador, parece que no puedo hacerlo.Verificar el valor del parámetro de referencia con 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);
}
Aquí está la prueba:
[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();
}
Esto es sólo el más reciente de muchos intentos de conseguir ahold de ese parámetro. Como referencia, el valor de real no cambia desde su estado inicial (construido).
Mover el Assert.AreEqual (esperado, actual) después de que falla la llamada de destino. Si agrego .Verifiable() a la configuración en lugar de .CallBack y luego llamo a remote.Verify después del objetivo (o, supongo, establezco el simulacro en strict) siempre falla porque el parámetro que proporciono en la prueba no es el misma instancia que la que se creó en el método del controlador.
Estoy usando Moq 3.0.308.2. Cualquier idea sobre cómo probar esto sería apreciada. ¡Gracias!
Supongo que tampoco estoy seguro de cómo lo harías (aunque no sé mucho sobre los stubs). ¿Puedes dar más detalles sobre cómo se podría manejar eso? –
Además, por mucho que esté de acuerdo con usted en el tema de referencia, esa es la manera en que funciona nuestra capa remota y me gustaría comenzar un precedente de envolver bits aleatorios del back-end para poder escribir pruebas más fácilmente. –
Estaba teniendo un problema similar, y me enfoqué tanto en hacer funcionar MoQ, ¡me olvidé de poder escribir mi propio código auxiliar! Gracias. –