Wie zu verwenden moq, um zu überprüfen, dass ein ähnliches Objekt übergeben wurde, als argument?
Ich hatte ein paar Gelegenheiten, wo sowas wäre hilfreich. Ich habe zum Beispiel eine AccountCreator
mit einem Create
- Methode mit einem NewAccount
. Meine AccountCreator
hat eine IRepository
wird schließlich verwendet werden, um das Konto zu erstellen. Meine AccountCreator
wird die erste Karte, die die Eigenschaften von NewAccount
zu Account
, zweiten Durchgang die Account
auf das repo um endlich zu erstellen. Meine tests in etwa so Aussehen:
public class when_creating_an_account
{
static Mock<IRepository> _mockedRepository;
static AccountCreator _accountCreator;
static NewAccount _newAccount;
static Account _result;
static Account _account;
Establish context = () =>
{
_mockedRepository = new Mock<IRepository>();
_accountCreator = new AccountCreator(_mockedRepository.Object);
_newAccount = new NewAccount();
_account = new Account();
_mockedRepository
.Setup(x => x.Create(Moq.It.IsAny<Account>()))
.Returns(_account);
};
Because of = () => _result = _accountCreator.Create(_newAccount);
It should_create_the_account_in_the_repository = () => _result.ShouldEqual(_account);
}
So, was ich brauchen, ist etwas zu ersetzen It.IsAny<Account>
, denn das hilft mir nicht sicher, dass die richtigen Konto erstellt wurde. Was wäre erstaunlich ist so etwas wie...
public class when_creating_an_account
{
static Mock<IRepository> _mockedRepository;
static AccountCreator _accountCreator;
static NewAccount _newAccount;
static Account _result;
static Account _account;
Establish context = () =>
{
_mockedRepository = new Mock<IRepository>();
_accountCreator = new AccountCreator(_mockedRepository.Object);
_newAccount = new NewAccount
{
//full of populated properties
};
_account = new Account
{
//matching properties to verify correct mapping
};
_mockedRepository
.Setup(x => x.Create(Moq.It.IsLike<Account>(_account)))
.Returns(_account);
};
Because of = () => _result = _accountCreator.Create(_newAccount);
It should_create_the_account_in_the_repository = () => _result.ShouldEqual(_account);
}
Ankündigung geändert habe It.IsAny<>
zu It.IsLike<>
übergeben und in einem besiedelten Account
Objekt. Idealerweise im hintergrund, etwas würde vergleichen Sie die Eigenschaftswerte ein und lassen Sie es passieren, wenn Sie alle übereinstimmen.
So, existiert es bereits? Oder könnte das etwas sein, was Sie vorher getan haben, und würde nicht dagegen teilen mit dem code?
- Moq unterstützt benutzerdefinierten Matcher - wie in, Sie können benutzerdefinierte Comparer verwendet, wenn die passenden Argumente für einen Anruf, aber Sie haben, um zu realisieren, dass Sie sich. Siehe Beispiel hier.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stub, ein repository zu kehren, einen bestimmten Wert, basierend auf Kriterien wie die folgende sollten funktionieren:
install-package ExpectedObjects
T IsEquivalent<T>(object expected) => It.Is<T>(x => expected.ToExpectedObject().Equals(x))
Sollten die folgenden arbeiten für Sie:
Aber wie es bereits erwähnt wurde, müssen Sie implementieren, matching-Kriterien.
Ich war nicht in der Lage, etwas zu finden, das genau das tut, was beschrieben ist in der Frage. In der Zwischenzeit ist der beste Weg, die ich finden kann zu handhaben, überprüfung von Objekten übergeben, die als Argumente an, verspotteten Methoden (ohne den Luxus referencial Gleichheit) ist eine Kombination von
Callback
und das Erwartete Objekt Muster zu vergleichen den tatsächlichen mit dem erwarteten Objekt:Dem erwarteten Objekt-Muster ist toll, aber es ist kompliziert zu implementieren in C#, also benutze ich eine Bibliothek, die Griffe für mich. https://github.com/derekgreer/expectedObjects
Mein letzten Beobachtung sieht die Eigenschaften in der Live-Konto zu übergeben, und vergleicht jeweils die gleiche Eigenschaft auf mein "Objekt erwartet". Diese Weise ich don ' T haben eine riesige Liste von mock-Eigenschaft überprüft, noch habe ich eine Tonne von test-Beobachtungen.