gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:57:05 25 4
gpt4 key购买 nike

所以我正在为我的单元测试使用模拟框架 (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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com