Тестирование взаимодействия с использованием родинок - PullRequest
1 голос
/ 03 ноября 2011

Как вы можете проверить тест взаимодействия с помощью родинок.Например, следующий тест написан с использованием макета Rhino.Может кто-нибудь сказать мне, как я могу достичь того же, используя родинки?Есть ли что-то вроде проверки на родинки?

[Test]
public void MyTest()
{
    MockRepository mocks = new MockRepository();
    ILogger mockLogger = mocks.StrictMock<ILogger>();

    using(mocks.Record())
    {
        mockLogger .Log("this is my error");
    }

    MyClass mc = new MyClass (mockLogger);

    mc.MyFunc("abcd");
    mocks.Verify(mockLogger);
}



class MyClass
{

    private ILogger logger;

    public MyClass(ILogger logger)
    { this.logger = logger; }

    public void MyFunc(string str)
    {

        logger.log("this is my error");
    }

}

Буду очень признателен за вашу помощь.

1 Ответ

0 голосов
/ 03 ноября 2011

Лично я использую Moq для внутренней зависимости и Moles для внешних факторов (и неприятные статические вещи, навязываемые мне другими), поэтому я не могу дать вам лучший способ, но это способ:

    [TestMethod, Owner("ebd"), TestCategory("Proven"), TestCategory("Unit")]
    public void MyTest()
    {
        var myCalled = false;
        var myLogger = new SILogger();
        myLogger.LogString = (s) => myCalled = true;
        var myClass = new MyClass(myLogger);
        myClass.MyFunc("abcd");

        Assert.IsTrue(myCalled);
    }

Ключевой идеей здесь является "SILogger", который является вашей заглушкой для ILogger. Затем вы устанавливаете поведение экземпляра для его «LogString» (что соответствует вашему методу log (string). Вы устанавливаете его для обратного вызова локальной переменной и устанавливаете для него значение true. Затем вы вызываете метод, который должен вызывать log, и утверждаете, что ваш местный теперь правда.

Опять же, я бы обычно делал это с Moq и использовал для этой цели myStub.Verify (), так что, возможно, есть более изящный способ сделать это с родинками, о которых я не знаю. Лично я думаю, что Moles гораздо лучше подходит для «насмешек над немоделируемыми», и я предпочитаю сочетание Moq (для моих собственных интерфейсов и классов) и Moq (для фреймворка и внешних возможностей, таких как File I / O, GUI, Db-соединения и т. Д. ).

...