c# - 什么时候使用模拟框架?

标签 c# unit-testing mocking moq

所以我正在为我的单元测试使用模拟框架 (Moq),想知道什么时候应该使用模拟框架?

以下两个测试之间的优势/劣势是什么:

public class Tests
{
    [Fact]
    public void TestWithMock()
    {
        // Arrange
        var repo = new Mock<IRepository>();

        var p = new Mock<Person>();
        p.Setup(x => x.Id).Returns(1);
        p.Setup(x => x.Name).Returns("Joe Blow");
        p.Setup(x => x.AkaNames).Returns(new List<string> { "Joey", "Mugs" });
        p.Setup(x => x.AkaNames.Remove(It.IsAny<string>()));

        // Act
        var service = new Service(repo.Object);
        service.RemoveAkaName(p.Object, "Mugs");

        // Assert
        p.Verify(x => x.AkaNames.Remove("Mugs"), Times.Once());
    }

    [Fact]
    public void TestWithoutMock()
    {
        // Arrange
        var repo = new Mock<IRepository>();

        var p = new Person { Id = 1, Name = "Joe Blow", AkaNames = new List<string> { "Joey", "Mugs" } };

        // Act
        var service = new Service(repo.Object);
        service.RemoveAkaName(p, "Mugs");

        // Assert
        Assert.True(p.AkaNames.Count == 1);
        Assert.True(p.AkaNames[0] == "Joey");
    }
}

最佳答案

使用模拟对象真正创建单元测试——假设所有依赖项都正常运行的测试,而你只想知道 SUT(被测系统——一种奇特的方式说你正在测试的类(class))有效。

模拟对象有助于“保证”您的依赖项正常运行,因为您创建了那些产生您配置的结果的依赖项的模拟版本。那么问题就变成了当其他一切都在“工作”时,您正在测试的一个类是否表现得像它应该的那样。

当您测试具有缓慢依赖性的对象(如数据库或 Web 服务)时,模拟对象尤为重要。如果您真的要访问数据库或进行真正的 Web 服务调用,那么您的测试将花费更多的时间来运行。当只多出几秒钟时,这是可以容忍的,但是当您在 continuous integration 中运行数百个测试时服务器,加起来非常快,会削弱您的自动化。

这就是模拟对象真正重要的原因——减少构建-测试-部署周期时间。确保您的测试快速运行对于高效的软件开发至关重要。

关于c# - 什么时候使用模拟框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19674363/

相关文章:

c# - 面向对象组合

c# - 移动按钮和图片框 vb/c#

c# - 使用 String.Equals(str1,str2) 和 str1 == str2 有什么区别

unit-testing - MvvmCross:带插件的单元测试服务

python - 模拟接受 **kwargs 的函数

iphone - Objective C - 如何使用 OC Mock?

c# - NHibernate/事件记录 : How to set foreign key without getting entire object?

unit-testing - Laravel 5.1 中的模拟请求用于(实际)单元测试

python - 如何通过运行单元测试引用我的设置文件?

unit-testing - Postman 不接受 `-` 作为模拟服务器请求的 URI 参数