gpt4 book ai didi

c# - 单元测试 : how to test dependent methods where mocking is unfeasible?

转载 作者:太空狗 更新时间:2023-10-30 00:19:27 26 4
gpt4 key购买 nike

我是 UnitTesting 的新手,刚遇到一个我不知道如何处理的情况,我会很感激任何提示 :)

情况如下,设想两种方法:

// simple standalone method
public bool HelperMethod(string substr) {
return substr.Equals("abc");
}

// complex method making (multiple) use of HelperMethod
public bool ActualMethod(string str) {

for (var i=0; i<str.Length; i++) {
var substr = str.Substring(i, 3);
if (HelperMethod(substr))
return true;
}

return false;
}

HelperMethod 功能没有依赖性,ActualMethod 然而依赖于 HelperMethod 因此如果 HelperMethod 它的单元测试将失败'一个确实如此。

实际上,如果我没记错的话,这就是模拟/依赖注入(inject)应该发挥作用的地方。

但在这种特定情况下,我想测试几个(任意大的)边缘情况(上面的代码可能不是必需的,但实际的 ActualMethod 实现是相当复杂的语法分析器)。由于 HelperMethod 在每个 ActualMethod 调用中被多次调用,我将不得不模拟数百个 HelperMethod 调用来进行我的测试,这似乎难以忍受(现在试想所需的 HelperMethod 调用次数将是输入的二次方..)。

我的问题是:如何优雅地测试一个将大量调用委托(delegate)给另一个方法的方法?我真的应该模拟所有这些委托(delegate)调用吗?或者我是否可以让方法测试依赖于其他方法的测试(例如 Assert(HelperMethodPassed)?或者没有办法改变实现的设计?

不幸的是,在 ActualMethod 中内联 HelperMethod 是不可能的,因为其他方法也依赖它。

提前致谢,非常感谢任何帮助! :)

附言:正在测试的项目是用 C# 编写的,我目前正在使用 MSTest 框架(但如果这能解决问题,我愿意切换到另一个框架)。

编辑:明确将 HelperMethodActualMethod 标记为公开。

最佳答案

一般来说,如果代码难以隔离进行测试,则表明存在设计问题。

由于您正在调用 HelperMethod在您尝试测试的方法的上下文中多次,听起来问题是 ActualMethod做得太多了。您可以通过打破 ActualMethod 使其更易于单元测试分解成更小的方法来获取 HelperMethod 的输出作为参数,然后对每个单独的方法进行单元测试。

当然,您需要确保 HelperMethod也进行了单元测试!

正如其他人所说,如果 HelperMethodprivate并且不在类外使用,那么你可以忽略上面的建议并确保HelperMethod通过确保您通过公共(public)接口(interface)(例如 ActualMethod)涵盖测试用例的每个合理排列来进行测试。不过,从根本上说,如果HelperMethod包含复杂的逻辑,它可能应该独立进行单元测试。

关于c# - 单元测试 : how to test dependent methods where mocking is unfeasible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20381274/

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