Ich bin gerade auf Moq umgestiegen und habe ein Problem festgestellt. Ich teste eine Methode, die eine neue Instanz eines Geschäftsobjekts erstellt, setzt die Eigenschaften des Objekts auf Benutzereingabewerte und ruft eine Methode (SaveCustomerContact) auf, um das neue Objekt zu speichern. Das Geschäftsobjekt wird als Ref-Argument übergeben, da es eine Remoting-Schicht durchläuft. Ich muss testen, dass das Objekt, das an SaveCustomerContact übergeben wird, alle seine Eigenschaften wie erwartet festgelegt hat, aber da es in der Controller-Methode als neu instanziiert wird, kann ich nicht so scheinen.Wert des Referenzparameters mit Moq überprüfen
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);
}
Hier ist der Test:
[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();
}
Dies ist nur die jüngste von vielen Versuchen ahold diesen Parameter zu erhalten. Als Referenz ändert sich der Wert von Ist nicht von seinem anfänglichen (konstruierten) Zustand.
Verschieben der Assert.AreEqual (erwartet, aktuell), nachdem der Zielaufruf fehlgeschlagen ist. Wenn ich .Verifizierbar() zum Setup anstelle von .CallBack hinzufügen und dann remote.Verify nach dem Ziel aufrufen (oder, vermute ich, setze den Mock auf strict), schlägt es immer fehl, weil der Parameter, den ich im Test zur Verfügung stelle, nicht der ist dieselbe Instanz wie diejenige, die in der Controller-Methode erstellt wurde.
Ich verwende Moq 3.0.308.2. Irgendwelche Ideen, wie man das prüft, würden geschätzt werden. Vielen Dank!
Ich denke, ich bin mir nicht sicher, wie du das auch stubst (obwohl ich nicht viel über Stubs weiß). Können Sie näher erläutern, wie damit umgegangen werden könnte? –
Auch so, wie ich Ihnen in der Ref-Frage zustimme, funktioniert unsere Remoting-Schicht so, und ich würde es hassen, einen Präzedenzfall für das Einfügen zufälliger Bits des Backends zu erstellen, damit ich Tests einfacher schreiben kann. –
Ich hatte ein ähnliches Problem und habe mich so darauf eingelassen, dass MoQ funktioniert, ich habe vergessen, dass ich meinen eigenen Stub schreiben könnte! Vielen Dank. –