Могу ли я определить, был ли доступ к объекту через Rhino Mocks

StackOverflow https://stackoverflow.com/questions/1297093

Вопрос

У меня есть свойство в интерфейсе, которое я смоделировал с помощью Rhino Mocks.Я хочу знать, был ли к нему доступ в моем модульном тестировании.

Есть ли способ узнать, был ли доступ к объекту через Rhino Mocks?

Я нашел этот код здесь но, похоже, это не работает:

string name = customerMock.Name;
customerMock.AssertWasCalled(x => {var ignored = x.Name;});

Я воспроизвел этот код и получаю следующее:

Rhino.Mocks.Exceptions.ExpectationViolationException: IAddAddressForm.get_FirstName(); Expected #1, Actual #0..

Я хотел бы использовать этот синтаксис, но, должно быть, я чего-то не понимаю.Я вызываю это с помощью заглушки (не макета), имеет ли это значение?

Это было полезно?

Решение 2

Оказывается, синтаксис, который я использовал, работает.Но это работает только в том случае, если свойство не находится в режиме PropertyBehavior.(Это значение по умолчанию для заглушек и может быть включено для макетов).

Если режим PropertyBehavior включен, этот синтаксис не работает.В соответствии с Айенде вам нужно проверить значение в этот момент.

Другие советы

Есть ли способ узнать, был ли доступ к объекту через Rhino Mocks?

ДА.Вы можете настроить ожидаемое значение для свойства.Если проверка не завершается, значит, вы знаете, что к объекту был получен доступ:

var mocks = new MockRepository();
IFoo foo = mocks.DynamicMock<IFoo>;
// this sets up an expectation that Name is accessed, and what it should return
Expect.Call(foo.Name).Return("John Doe"); 
mocks.ReplayAll()

// test something that uses IFoo here ...

mocks.VerifyAll();  // Throws if foo.Name was not accessed after ReplayAll()

Это все при условии, что вы хотите foo.Name для получения доступа.Если ваша цель состоит в том, чтобы убедиться, что это так нет доступ, тогда вам следует просто использовать StrictMock вместо DynamicMock.За любые неожиданные вызовы будет выдан строгий макет.

Если вы хотите утверждать, что был вызван метод или получен доступ к свойству поддельного объекта, вам всегда следует использовать макет.Заглушки предназначены для тех ситуаций, когда вы не хотите тестировать взаимодействие, а просто хотите убедиться, что вызов некоторого объекта возвращает определенное значение, чтобы обеспечить поток логики.

Я считаю, что StrictMock — это то, что вы ищете.Есть некоторая информация об этом здесь.Говорят, что его использование не рекомендуется, поскольку оно может сделать тесты слишком хрупкими, однако оно должно помочь вам достичь того, что вы пытаетесь сделать.

Вы можете проверить стек вызовов, используя StackFrame сорт.Не очень чисто, но должно дать желаемый результат...

Я обычно использую Мокк который использует Castle, поэтому вы можете рассмотреть его вместо/вместе с Rhino Mocks.Вот как это можно сделать там:

// expects an invocation to set the value to "foo"
mock.SetupSet(foo => foo.Name = "foo");

// or verify the setter directly
mock.VerifySet(foo => foo.Name = "foo");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top