我应该模拟框架类吗?

本文关键字:框架 模拟 我应该 | 更新日期: 2023-09-27 18:04:08

我正在使用c#和。net framework 4编写一个绿地项目,由于我的上一个应用程序缺乏测试,并且设计不太可测试,所以我决定这次避免犯同样的错误。

我已经获得了注入到类的接口中的每个类的外部依赖,现在我正在编写具体的实现。虽然我不打算开始编写单元测试来测试框架中的代码,但我担心,如果在调用框架类的方式中存在错误,那么我就无法对其进行测试。作为一个非常简单的例子,让我们说我正在使用SQLCommand(我实际上使用EF 4.1,但这只是一个例子),我忘记设置命令上的连接属性。我的想法是,如果我模拟出某些框架类,我就可以用模拟来测试这些约定,从而避免潜在的bug来源。这样做还意味着我从框架类中模拟某些异常,这些异常难以测试,但确实会发生,例如UnauthorizedAccessException, OutOfMemoryException等。

我意识到,当我试图运行代码来测试它时,代码很可能会崩溃,但我的脑海里有一些东西告诉我,我仍然有可能错过一些东西,只有在产品投入使用后才能发现它。这样做有什么理由吗?或者这是一个相当严重的YAGNI案例?

我应该模拟框架类吗?

创建注入接口的具体模型太过分了。您不需要模拟整个框架。然而,你应该检查你的代码路径,并确保你正确处理异常和无效输入。

大多数模拟框架,比如Rhino Mocks,允许你模拟从注入的模拟对象中抛出的异常。

[Test]
public void testThrowsExceptions()
{
    // Arrange
    var dependency1 = MockRepository.Mock<IMockFrameworkObject1>();
    var dependency2 = MockRepository.Mock<IMockFrameworkObject2>();
    dependency2.Expect(d2 => d2.SomeAction).Throws(new someexception);
    var myObject = new ConcreteObject(dependency1, dependency2);
    // Act
    myObject.SomeAction();
    // Assert
}

我认为mock类具有相当大的价值,可以引入难以刺激的错误,从而正确测试错误路径。

我不知道框架是如何捕获"忘记设置xxx"错误的。您的Mock需要"知道"框架期望在findThing()之前调用setConnection(),为了捕获这些错误,您需要模拟整个框架。

我认为你需要看看单元测试——练习你自己的代码路径——它可以从使用mock和集成测试中受益,后者测试不同组件的交互,比如你的代码与框架。

您可以在这两种情况下使用相同的测试驱动程序(我是Java,所以对我来说是JUnit),但是测试策略不同。

你可以使用mole来模拟框架方法调用。下面是如何将它用于数据库:使用Mole对SQLDataReader

进行单元测试