Mik*_*ike 7 c# unit-testing design-patterns dependency-injection
我有一个消费者类负责消费字符串并决定如何处理它.它可以解析并将解析数据插入数据库中或通知管理员.
以下是我的实施.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我的单元测试.
// 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());
Run Code Online (Sandbox Code Playgroud)
在单元测试中混合模拟和实际实现是代码味道吗?另外,如何总是必须测试方法是否abc()总是运行一次?每次我在if块中添加一个函数时,我添加一个新的单元测试似乎是不正确的.似乎如果我继续添加到我的Consume方法我会创建一个陷阱.
谢谢.
要进行挑剔,单元测试是一种自动测试,可以单独测试一个单元.如果你组合两个或更多单元,它不再是单元测试,它是一个集成测试.
但是,根据您集成的单元类型,进行大量此类集成测试可能会非常好.
Krzysztof Kozmic最近写了一篇关于此的博客文章,他描述了温莎城堡如何进行单元测试,但进行了大量的集成测试.AutoFixture在这些类型的集成测试中也占很大比例.我认为最重要的一点是,作为一般规则,整合不得跨越图书馆界限.
在任何情况下,您都可以将实际实现视为Test Double Continuum的极端,因此正如有些情况下使用Stubs,Mocks,Spies或Fakes一样,还有一些场景可能会使实际实现感觉.
然而,只要记住,你不再测试单元隔离,所以你做介绍,该单元之间的耦合,使之更难以独立地改变每个.
总而言之,我仍然认为它是一种气味,因为它应该永远是一个停下来思考的机会.然而,气味表明只有这一点,有时,一旦你想到它,你可以决定继续前进.