2009-09-02 2 views
2

Возможно ли в Rhino.Mocks проверить, был ли указан указанный конструктор?Rhino Mocks: Как проверить, что конструктор был вызван

Рассмотрим следующий код:

public interface IFoo 
{ 
    void Bar(); 
} 

public class FooFactory 
{ 

    public IFoo CreateInstance(int x, int y) 
    { 
    return new Foo(x, y); 
    } 

} 

public class Foo : IFoo 
{ 

    public Foo(int x, int y) 
    { 
    // ... blah 
    } 

    public void Bar() 
    { 
    // blah... 
    } 

} 

[TestFixture] 
public class FooFactoryTest 
{ 

    [Test] 
    public void Assert_Foo_Ctor_Called_By_Factory_CreateInstance() 
    { 

    MockRepository mocks = new MockRepository(); 

    using (mocks.Record()) 
    { 
     Expect.Call(/* ???? */); 
    } 

    using(mocks.Playback()) 
    { 
     new FooFactory().CreateInstance(1, 2); 
    } 

    mocks.VerifyAll(); 

    } 

} 

Я хотел бы, чтобы убедиться, что Foo (INT, INT) был вызван FooFactory.

ответ

4

Короткий ответ: Нет, это не так, как работает Rhino Mocks (или любой насмешливый каркас, который я думаю).

Более длинный ответ: Вы действительно не делаете это правильно. Одна из нескольких причин использования фабрики заключается в том, что вы можете издеваться над созданием новых объектов - это означает, что вы будете издеваться над вашим FooFactory и давать макет для тестирования других объектов. Возможно, на вашем заводе есть много логики, которые вы хотели бы испытать также - подумайте о том, чтобы разделить эту логику на другой класс, такой как строитель, который может быть протестирован изолированно.

+0

Согласен. Я бы очень сомневался в необходимости проверить, что был вызван какой-то конкретный конструктор ... звучит как по спецификации для меня. То, что вы должны тестировать, заключается в том, что завод производит ожидаемый результат на основе конкретного ввода. –

2

Я не думаю, что вы можете делать то, что вы просите. Однако, если

Foo(int, int)
является единственным конструктором на Foo, то вы можете просто утверждать, тип возвращаемого объекта IFoo т.е.

 
Assert.IsInstanceOfType(typeof(Foo), foo); 

Если есть более чем один конструктор, то вам придется проверить некоторые внешние состояния возвращаемого объект:

 
Foo f = (Foo)fooReturnedFromFactory; 
Assert.AreEqual(1, f.X); 
Assert.AreEqual(2, f.Y); 
0

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

Но вы можете проверить это косвенно. Например, если вы установите свойство «A» равным 5, вы можете проверить значение свойства «A».

Смежные вопросы