RhinoMocks имеет разные варианты использования, и порой может слегка вводить в заблуждение. Я например, вот про этот аспект регулярно забываю, если долго не пишу тесты на Rhino:
Стаб не имеет ожиданий и предназначен для тестирования состояния класса, но при желании ожидания для стаба можно установить и уже тестировать поведение.
Если мы напишем:
public interface IFoo
{
void Method1();
void Method2();
}
public class TestedClass
{
private IFoo _foo;
public TestedClass(IFoo foo)
{
_foo = foo;
}
public void TestedMethod()
{
_foo.Method1();
_foo.Method2();
}
}
[TestMethod]
public void Test1()
{
MockRepository repository = new MockRepository();
IFoo foo = repository.Stub<IFoo>();
//IFoo foo = repository.StrictMock<IFoo>();
//IFoo foo = repository.DynamicMock<IFoo>();
//foo.Expect(x => x.Method1());
//foo.Expect(x => x.Method2());
repository.ReplayAll();
TestedClass test = new TestedClass(foo);
test.TestedMethod();
repository.VerifyAll();
}
то тест благополучно пройдет, так как у стаба по умолчанию нету ожиданий. Но стоить только указать в ожиданиях вызов хоть одного метода, и stub начинает вести себя как самый настоящий StrictMock и в отличии от DynamicMock'a ругается на вызов любого непредусмотренного метода.
Также, можно при желании "избавить от каких либо обязательств" StrickMock "застабив" все его методы :)
IFoo foo = repository.StrictMock<IFoo>();
foo.Stub(x => x.Method1());
foo.Stub(x => x.Method2());
и в таком случае нам уже не важно, вызывалось ли что-то в тестируем классе :)
Комментариев нет:
Отправить комментарий