Moq и конструкторы - тестирование поведения инициализации - PullRequest
5 голосов
/ 08 сентября 2010

Я хотел бы иметь возможность правильно тестировать инициализации класса, используя Moq:

class ClassToTest
{
    public ClassToTest()
    {
        Method1(@"C:\myfile.dat")
    }

    public virtual void Method1(string filename)
    {
        // mock this method
        File.Create(filename);
    }
}

Я думал, что смогу использовать свойство CallBase для создания тестируемой версии классазатем используйте .Setup(), чтобы убедиться, что Method1() не выполняет никакого кода.

Однако создание Mock<ClassToTest>() не вызывает конструктор, и если бы это произошло, было бы слишком поздноSetup()!

Если это невозможно, как лучше всего решить проблему при обеспечении правильного поведения конструктора?

РЕДАКТИРОВАТЬ: Чтобы сделать его более понятным,Я добавил параметр к Method1(), чтобы взять имя файла и добавил немного поведения.Тест, который я хотел бы написать, будет рабочей версией следующего:

[Test]
public void ClassToTest_ShouldCreateFileOnInitialisation()
{
    Mock<ClassToTest> mockClass = new Mock<ClassToTest>() { CallBase = true };
    mockClass.Setup(x => x.Method1(It.IsAny<string>());

    mockClass.Verify(x => x.Method1(@"C:\myfile.dat"));
}

1 Ответ

9 голосов
/ 13 октября 2010

Путь внутрь Moq.Mock (фактически внутри CastleProxyFactory, который Moq использует)

mockClass.Object

вызовет конструктор с помощью Activator.CreateInstance()

Итак, ваш тест будет выглядеть примерно так:

[Test]
public void ClassToTest_ShouldCreateFileOnInitialisation()
{
    Mock<ClassToTest> mockClass = new Mock<ClassToTest>();
    mockClass.Setup(x => x.Method1(It.IsAny<string>());

    var o = mockClass.Object;

    mockClass.Verify(x => x.Method1(@"C:\myfile.dat"));
}
...