Спасибо

ько что переключился на Moq и столкнулся с проблемой. Я тестирую метод, который создает новый экземпляр бизнес-объекта, устанавливает свойства объекта из входных значений пользователя и вызывает метод (SaveCustomerContact) для сохранения нового объекта. Бизнес-объект передается в качестве аргумента ref, поскольку он проходит через удаленный слой. Мне нужно проверить, что для объекта, передаваемого в SaveCustomerContact, все его свойства установлены так, как ожидалось, но, поскольку он создается как новый в методе контроллера, я не могу этого сделать.

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 );
}

Вот тест:

[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();

}

Это только последняя из многих попыток получить доступ к этому параметру. Для справки, значение фактического не изменяется от своего начального (построенного) состояния.

Перемещение Assert.AreEqual (ожидаемое, фактическое) после сбоя целевого вызова. Если я добавляю .Verifiable () в настройку вместо .CallBack и затем вызываю remote.Verify после цели (или, я полагаю, устанавливаю для mock строгий режим), он всегда завершается ошибкой, поскольку параметр, который я предоставляю в тесте, не является тот же экземпляр, что и в методе контроллера.

Я использую Moq 3.0.308.2. Любые идеи о том, как проверить это, будут оценены. Спасибо!

Ответы на вопрос(4)

Ваш ответ на вопрос