模拟不返回值的方法

时间:2012-09-03 14:13:15

标签: c# mocking

我有一个方法,它包含一系列对方法的调用,该方法检查字符串输入是空还是空。如果为空,则将第二个参数设置为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 => final result = true而不是false。

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

boolvalue type,这意味着该值将传递给方法而不是参考。

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

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

或者您可以使用可能不是您想要的ref / out

答案 1 :(得分:1)

最简单的是重组链接来电。

如果只是简单地将上一个答案与新答案联系起来,那就没有必要了。

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));        
}  

注意:

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

在此功能中,首先使用短路(&&)检查 ret 表示如果我们已经失败,我们无需检查当前输入。