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.
Schreibe einen Kommentar