gpt4 book ai didi

c# - 对使用其他方法的方法进行单元测试

转载 作者:太空宇宙 更新时间:2023-11-03 17:55:21 25 4
gpt4 key购买 nike

我是单元测试的新手,对如何编写这样的单元测试方法感到困惑:

public Boolean BeepInTime(Interfaces.IDateTime time,TimeSpan beepTime)
{
Interfaces.IBeep beep= new Beep();
var h = time.GetTime();
if (h == beepTime)
{
return beep.Beeping();
}
else
{
return false;
}
}

public Boolean Beeping()
{
try
{
SystemSounds.Beep.Play();
return true;
}
catch
{
return false;
}
}

在测试 BeepInTime 时,我希望 (beep.Beeping()) 不运行。我阅读了有关 stub 的内容,并认为在这种情况下我应该使用 stub ,但对于如何执行此操作感到困惑。您能否发送一些关于 stub 的简单示例的源代码。

最佳答案

解决方案是——依赖注入(inject)。

每次你做或看到 ... = new ...(); (构造)时都会想到依赖注入(inject),基本上显式实例化会引入依赖关系,然后有时会为这样的代码编写单元测试变得不重要。

因此,不是显式实例化 Beep 类,而是注入(inject)它。有什么好处 - 你已经有一个抽象这个类的接口(interface) - IBeep,这将允许你在编写单元测试时创建和注入(inject)模拟而不是真实的类实例。

public Boolean BeepInTime(Interfaces.IBeep beeper, TimeSpan beepTime) 
{
var h = time.GetTime();
if (h == beepTime)
{
return beep.Beeping();
}

return false;
}

Ans 想象一下这种技术在注入(inject)数据库访问服务或 Web 服务的情况下有何帮助,您在编写单元测试时不需要真正的数据库或 Web 服务 - 您只需模拟 DB/Web 服务即可。

使用 RhinoMocks 的例子:

var mock = MockRepository.GenerateMock<IBeep>();

// setup Beeping() return value == true
mock.Expect(m => m.Beeping()).Return(true);
var isBeepInTime = BeepInTime(mock, timeSpan)

关于c# - 对使用其他方法的方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12318947/

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