#rhino-mocks
#rhino-издевается
Вопрос:
Мой следующий прямой тест не проходит (хотя я чувствую, что должен). Либо я что-то упускаю, либо неясно ограничение Property.value. пожалуйста, помогите мне в понимании концепции ограничения property.value.
public interface ISomeInterface
{
void SomeMethod(string x, string y);
}
открытый класс someclassstest
{
[Test]
public void SomeMethodTest()
{
MockRepository mocks = new MockRepository();
ISomeInterface mockservice = mocks.StrictMock<ISomeInterface>();
using (mocks.Record())
{
mockservice.SomeMethod("xValue", "yValue");
LastCall.Constraints(Property.Value("x", "xValue"),
Property.Value("y", "yValue"));
}
mockservice.SomeMethod("xValue", "yValue");
mocks.Verify(mockservice);
}
}
Возникло исключение:
Rhino.Издевается.Исключения.Исключение ExpectationViolationException : ISomeInterface.someMethod(«xValue», «yValue»); Ожидаемый # 0, фактический # 1. ISomeInterface.Некоторый метод (свойство ‘x’ равно xValue, свойство ‘y’ равно yValue); Ожидаемый # 1, фактический # 0.
Ответ №1:
Я бы порекомендовал вам следующий синтаксис (синтаксис AAA):
// arrange
var mockservice = MockRepository.GenerateMock<ISomeInterface>();
// act
mockservice.SomeMethod("xValue", "yValue");
// assert
mockservice.AssertWasCalled(
x => x.SomeMethod("xValue", "yValue")
);
Комментарии:
1. Спасибо за это (отмечено), но здесь мне больше интересно узнать об ограничении Property.Value. Когда я устанавливаю ограничения и передаю значения, которые должны их удовлетворять, почему это все еще не удается?
2. @enableDeepak, IIRC (синтаксис старый, и я могу ошибаться, поскольку прошло много времени, этот синтаксис устарел), но не
Property.Value
для проверки вызовов свойств? В вашем случае вы используете вызов метода.
Ответ №2:
Этот пример класса иллюстрирует варианты утверждения, что методы были вызваны с соответствующими свойствами:
public class UsesThing
{
private IMyThing _thing;
public UsesThing(IMyThing thing)
{
_thing = thing;
}
public void DoTheThing(int myparm)
{
_thing.DoWork(myparm, Helper.GetParmString(myparm));
}
public void DoAnotherThing(int myparm)
{
AnotherThing thing2 = new AnotherThing();
thing2.MyProperty = myparm 2;
_thing.DoMoreWork(thing2)
}
}
Использование простых значений для утверждений может работать для методов, подобных методу doTheThing, который использует типы значений:
[Test]
public void TestDoTheThing()
{
IMyThing thing = MockRepository.GenerateMock<IMyThing>();
UsesThing user = new UsesThing(thing);
user.DoTheThing(1);
thing.AssertWasCalled(t => t.DoWork(1, "one");
}
Однако, если вам нужно создать объект в вашем методе и передать его в качестве параметра, как в методе DoAnotherThing, этот подход не сработает, поскольку у вас не будет ссылки на объект. Вы должны проверить значения свойств неизвестного объекта, вот так:
[Test]
public void TestDoAnotherThing()
{
IMyThing thing = MockRepository.GenerateMock<IMyThing>();
UsesThing user = new UsesThing(thing);
user.DoAnotherThing(1);
thing.AssertWasCalled(t => t.DoMoreWork(null), t => t.IgnoreArguments().Constraints(Property.Value("MyProperty", 3))));
}
Новый синтаксис Rhino будет выглядеть следующим образом, но при его использовании происходит сбой по сравнению с 2008 годом:
thing.AssertWasCalled(t => t.DoMoreWork(Arg<AnotherThing>.Matches(Property.Value("MyProperty", 3))));