Установщик свойства заглушки с Rhino.Mocks для выполнения действия при вызове? - PullRequest
5 голосов
/ 07 ноября 2010

Это можно сделать с помощью следующих методов:

myStub.Stub(x => x.SomeMethod()).WhenCalled(x => do something);

Можно ли сделать то же самое, когда вызывается установщик свойств?

Ответы [ 5 ]

3 голосов
/ 07 ноября 2010

Будет работать следующее:

Expect.Call(myStub.MyProperty).WhenCalled(p => Console.WriteLine("Called")).Return("Test result");

Обратите внимание, что это работает, только если ваши свойства (в данном случае MyProperty) объявлены виртуальными.

1 голос
/ 05 сентября 2013

Я знаю, что это немного устарело, но все ответы были немного неясными.С тех пор Айенде разместила раздел, посвященный этой проблеме, со старыми и новыми конструкциями, которые, как мне показалось, могут быть полезны, если я найду это снова.

Rhino Mocks 3.5 .

Добавлены две конструкции для ожидания настроек свойств.Ранее это было возможно с Rhino.Mocks, однако в синтаксисе беглого интерфейса не было выразительной конструкции.

Ожидание установки свойства с определенным значением указывается так:

Expect.Вызов (mockedCustomer.Name) .SetPropertyWithArguments ("Ayende");

Только для тестирования взаимодействия, ожидание установки свойства без указанного значения выполняется следующим образом:

Expect.Call (mockedCustomer.Name) .SetPropertyAndIgnoreArguments ();

Эти новые конструкции равны:

using (mocks.Record ()) {mockedCustomer.Name = "Ayende";// установить ожидание для установки определенного аргумента.

LastCall.IgnoreArguments ();// Мы можем игнорировать аргументы этого ожидания, так как дает нам ожидание установки свойства, независимо от фактического значения.}

1 голос
/ 10 января 2013

Так что Питер и Патрик уже дали правильный ответ, но если вы хотите использовать из коробки , может помочь более полный пример.Итак, вот оно:

[Test]
public void Test()
{
    var fakedInterface = MockRepository.GenerateMock<ISite>();

    // Stub property setter and call own lambda when invoked.
    fakedInterface.BackToRecord();
    Expect.Call(fakedInterface.Name).SetPropertyAndIgnoreArgument().WhenCalled(a =>
    {
        Assert.That(a.Arguments.Length, Is.EqualTo(1));
        Assert.That(a.Arguments[0], Is.EqualTo("abc"));

        // Stub property getter with provided value.
        fakedInterface.Stub(x => x.Name).Return((String)a.Arguments[0]);
    });
    fakedInterface.Replay();

    // Set the property (and let our above lambda be invoked)
    fakedInterface.Name = "abc";

    // Get the property (the value that was freshly stubbed within the lamba.
    var result = fakedInterface.Name;
    Assert.That(result, Is.EqualTo("abc"));
}

Следующий трюк в этом примере заключается в том, что возвращаемое значение будет вставлено в лямбду, так что вы сможете вызывать / тестировать все что угодно в установщике иСледующим шагом вы сможете получить это значение через обычное свойство getter.

1 голос
/ 22 декабря 2010

Переведите макет в режим «записи» и используйте старую семантику записи / воспроизведения, чтобы установить ожидание для установщика свойства:

stub.BackToRecord();
Expect.Call(stub.SomeProperty).SetPropertyAndIgnoreArgument().WhenCalled(p => ...do something...);
stub.Replay();
1 голос
/ 07 ноября 2010

У меня нет под рукой Visual Studio, но я уверен, что что-то вроде этого должно работать:

myStub.Stub(x => x.SomeProperty = null).WhenCalled(x => do something);
...