【问题标题】:Mocking a method that doesnt return a value模拟不返回值的方法
【发布时间】:2012-09-03 14:13:15
【问题描述】:

我有一个方法,其中包含对检查字符串输入是否为空或为空的方法的一系列调用。如果为空,则将第二个参数设置为 false;

public bool inputsContainData()
{
    bool validInputs = True;

    _helper.StringContainsData(_view.FilePath1, validInputs);
    _helper.StringContainsData(_view.FilePath2, validInputs);

    //...

    Return validInputs;
}

StringContainsData() 方法在一个被 DI 注入到演示者中的类中。该方法不返回任何内容,因为结果变量是引用类型。

public void StringContainsData(string input, bool result)
{
    if( string.IsNullOrEmpty(input))
    {
        result = false;
    }
}

我对此有一些问题,因为我无法模拟 StringContainsData() 并让它返回特定的结果。我能想到的唯一解决方案是,如果我包含第二个 If 语句,如下所示:

    public bool StringContainsData(string input, bool result)
    {
        if( string.IsNullOrEmpty(input))
        {
            if(result != false)
            {
                return false;
            }
        }
        else
        {
            if(result == false)
            {
                return false;
            }
        }
        return true;
    }

因此阻止我得到 True,False,True => 最终结果 = true 而不是 false。

有更好的方法吗?

【问题讨论】:

  • 你的方法没用。外部方法看不到result 内部result 的更改,因为该参数不是refout 参数。
  • 在开始模拟之前修复StringContainsData...另外,为什么要模拟这样一个微不足道的功能?
  • 再次,请修复您的代码。它甚至不会编译。
  • @leppie,抱歉 id 在没有签入 VS 的情况下将其写入。我已经按照你的要求更新了它。现在应该可以了(摸木头)

标签: c# mocking


【解决方案1】:

boolvalue type,这意味着该值将被传递给方法而不是引用。

您有两个选择,您可以从方法 StringContainsData 返回一个 bool 结果,如下所示:

public bool StringContainsData(string input, bool result)
{
    return string.IsNullOrEmpty(input);
}

或者你可以使用ref/out,这可能不是你想要的。

【讨论】:

  • @Hans Rudel 编写的代码不会考虑以前的结果。如果第一个 FilePath 为空,但第二个未使用,那么即使意图似乎是确保所有路径都不为空,这也会给出真实的结果。
  • AlanT 的答案更适合原始问题,因此我将答案切换为他的。不过,您的回答仍然 +1 + 感谢您的帮助。
【解决方案2】:

最简单的方法是重组以链接调用。

如果不需要另一个 if,只需将之前的答案与新答案进行 AND 运算即可。

public bool StringContainsData(string aString, bool answerToDate) {
    return answerToDate && !string.IsNullOrWhiteSpace(aString);
}

public bool inputsContainData() {        
    bool validInputs = True;        

    validInputs = _helper.StringContainsData(_view.FilePath1, validInputs);        
    validInputs = _helper.StringContainsData(_view.FilePath2, validInputs);        

    return validInputs;        
}        

或者如果你想玩得开心

public bool inputsContainData() {        
    var inputs = new []{ _view.FilePath1, _view.FilePath2};
    return inputs.Aggregate(true, (ret, inp) => ret && !string.IsNullOrWhiteSpace(inp));        
}  

注意事项:

最后一个版本本身看起来很复杂,但如果您要添加更多文件路径来检查扩展数组比在分配/调用行上剪切/过去更简单/更安全。

在函数中,先检查ret,使用短接(&&)表示如果已经失败则​​不需要检查当前输入。

【讨论】:

  • 你是对的。目前我采用了一种稍微不同的方法(使用属性并在其中包含逻辑,因为 InputsContainData() 不仅包含 StringContainsData() 方法。)我的一个测试仍然无法正常工作,所以我可能会求助于你的解决方案到底。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 2022-12-09
  • 2022-11-07
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 2017-09-12
相关资源
最近更新 更多