gpt4 book ai didi

c# - 混合在实际实现和模拟中是一种测试气味吗?

转载 作者:太空狗 更新时间:2023-10-29 20:01:56 26 4
gpt4 key购买 nike

我有一个消费者类负责消费一个字符串并决定如何处理它。它可以解析并将解析数据插入数据库或通知管理员。

下面是我的实现。

public void Consume(string email)
{
if(_emailValidator.IsLocate(email))
{
var parsedLocate = _parser.Parse(email);

// Insert locate in database
}
else if(_emailValidator.IsGoodNightCall(email))
{
// Notify email notifying them that a locate email requires attention.
_notifier.Notify();
}
}

下面是我的单元测试。

// Arrange
var validator = new EmailValidator();
var parser = new Mock<IParser>();
var notifier = new Mock<INotifier>();
var consumer = new LocateConsumer(validator, parser.Object, notifier.Object);
var email = EmailLiterals.Locate;

// Act
consumer.Consume(email);

// Assert
parser.Verify(x => x.Parse(email), Times.Once());

在单元测试中混合模拟和实际实现是否有代码味道?另外,如何总是必须测试方法 abc() 是否总是运行一次?每次我在 if block 中添加一个函数时,我都会添加一个新的单元测试,这似乎是不对的。似乎如果我继续向我的 Consume 方法添加内容,我就会创建一个陷阱。

谢谢。

最佳答案

简单地说,单元测试是一种独立测试单元的自动化测试。如果您组合两个或多个单元,它就不再是单元测试,而是集成测试

但是,根据您集成的单元类型,进行大量此类集成测试可能没问题。

Krzysztof Kozmic 最近写了一篇关于此的博客文章,他描述了如何 Castle Windsor has very few unit tests ,但是很多集成测试。 AutoFixture在这些类型的集成测试中也占有很大份额。我认为最重要的一点是,作为一般规则,集成不得跨越库边界

在任何情况下,您都可以将实际实现 视为Test Double Continuum 的一个极端,所以就像在某些情况下使用 stub 、模拟、 spy 或假货是有意义的一样,也有在实际实现中可能有意义的情况

但是,请记住,您不再孤立地测试单元,因此您确实在单元之间引入了耦合,这使得更难以独立地改变每个单元 .

总而言之,我仍然认为它是一种气味,因为它应该始终是一个停下来思考的机会。然而,气味仅能说明这一点,有时,一旦您深思熟虑,就可以决定继续前进。

关于c# - 混合在实际实现和模拟中是一种测试气味吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5409796/

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