2012-09-03 146 views
0

我有一個方法,其中包含一系列調用方法,該方法檢查字符串輸入是否爲空或空。如果它爲空,則將第二個參數設置爲false;嘲笑不返回值的方法

public bool inputsContainData() 
{ 
    bool validInputs = True; 

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

    //... 

    Return validInputs; 
} 

的StringContainsData()方法是在其中DI'd到演示的類。該方法不返回任何內容,因爲結果變量是引用類型。

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

我有一些問題,因爲我不能模擬StringContainsData()並讓它返回一個特定的結果。我能想到的唯一的解決辦法是,如果我有第二個。如果聲明如下:

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阻止我。

有沒有更好的方法來做到這一點?

+5

你的方法沒用。由於參數不是'ref'或'out'參數,因此外部方法無法看到'StringContainsData'內'result'的變化。 –

+0

修正'StringContainsData'之前,甚至去嘲笑...另外,爲什麼嘲笑這樣一個平凡的功能? – leppie

+1

再次請修正您的代碼。它甚至不會編譯。 – leppie

回答

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

注:

的最後一個版本看起來像併發症爲了自身的利益,但如果你要添加更多的文件路徑檢查擴展數組比分配/呼叫線路上的剪切/過去更簡單/更安全。

在功能方面,首先用短路(& &)檢查RET意味着我們並不需要檢查當前的輸入,如果我們已經失敗了。

+0

你是對的。目前我使用了一種稍微不同的方法(使用一個屬性,並且因爲InputsContainData()不包含StringContainsData()方法而具有邏輯。)我的一個測試仍然沒有工作,所以我可能會求助於你的解決方案到底。謝謝你的幫助。 –

2

bool是一個value type這意味着該值將傳遞給該方法而不是引用。

你有兩個選擇,你可以從方法StringContainsData返回bool結果是這樣的:

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

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

+1

@Hans Rudel寫的代碼不會考慮到以前的結果。如果第一個FilePath爲空,但第二個不使用,那麼即使意圖似乎確保沒有任何路徑是空白的,這也會給出真實的結果。 – AlanT

+0

AlanT的答案更適合原始問題,所以我已將答案轉換爲他的答案。儘管如此,你的答案仍然+1,謝謝你的幫助。 –