Ich hatte ein paar Gelegenheiten, wo so etwas hilfreich wäre. Ich habe zum Beispiel eine AccountCreator
mit einer Create
Methode, die eine NewAccount
dauert. Meine AccountCreator
hat eine IRepository
, die schließlich verwendet wird, um das Konto zu erstellen. Mein AccountCreator
wird zuerst die Eigenschaften von NewAccount
bis Account
abbilden, zweitens die Account
an den Repo übergeben, um es endlich zu erstellen. Meine Tests in etwa so aussehen:Wie kann moq verwendet werden, um zu überprüfen, ob ein ähnliches Objekt als Argument übergeben wurde?
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);
}
Also, was ich brauche, ist etwas It.IsAny<Account>
zu ersetzen, denn das hilft mir nicht überprüfen, ob das richtige 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);
}
Hinweis I It.IsAny<>
zu It.IsLike<>
geändert und in einem bevölkerten Account
-Objekt übergeben. Idealerweise vergleicht etwas im Hintergrund die Eigenschaftswerte und lässt sie passieren, wenn sie alle übereinstimmen.
Also existiert es schon? Oder ist das vielleicht etwas, das Sie schon einmal gemacht haben und es Ihnen nichts ausmacht, den Code zu teilen?
Moq unterstützt benutzerdefinierte Matcher - wie in, Sie benutzerdefinierten comparers verwendet haben können, wenn Argumente für einen Anruf passend , aber das musst du selbst umsetzen. Siehe Beispiel [hier] (http://stackoverflow.com/a/10300051/343266). –