2013-07-03 66 views
1

我們正在開發類似規格書的框架(如MSpec,NSpec等),並希望在運行時區分規範類中的方法:區分方法返回類型

public class AccountSpecs 
{ 
    private Account sut; // subject under test 

    Given an_account() { sut = new Account(); } 

    When changing_owner() 
    { 
     var result = sut.ChangeOwner("new owner"); 
     It["returns_previous_owner"] =() => result.ShouldBe("old owner"); 
    } 
} 

正如你可以看到這個類不可編譯,因爲an_account()和changing_owner()沒有返回語句。

Q1:我猜在C#中絕對沒有辦法指定如果沒有給出return語句,默認情況下使用「return null」?由於沒有全局類型別名(類似typedef When as System.Void),我們不得不實際引入類Given和When,並強制用戶返回此方法中的某些內容。

我們在When.ENABLEDWhen.DISABLED("reason")的When方法中使用return語句來臨時禁用規範。

在「給定方法」中,我們想要返回待測主題。我們要啓用以下:

Given an_account() { sut = new Account(); return sut; } 

不過:「無法轉換表達式類型...返回類型...」

接下來,我們想到了一個隱式轉換操作符的任何對象考慮,然而,這在C#中是不允許的,請參閱:cs0553 user-defined conversion from base class not allowed

Q2:那麼是否有任何解決方法可以使此工作或返回類型區分概念註定要失敗?

+3

這聽起來像你需要設計你自己的語言。 –

+0

還有其他人這樣做了,例如但是,SpecFlow認爲創建我們自己的DSL大大降低了用戶對框架的接受度。 –

+0

請做你的未來的自己一個忙,並選擇更好的類名(當/給/應該),否則你後[默認?](http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx) – Sayse

回答

1

如果稍微改變一下設計,有很多選擇。

  1. 您可以添加porperty來考慮類型,將舉行一個refernce到任何物體,使an_account將return Given(sut)
  2. 您可以從an_account與[Given]屬性返回純對象和標記方法
  3. 你可以也擺脫了這種方法在類的方法,只是使用流利的界面,如linq,建立一個測試定義的生成器模式。

像這樣:

new Test() 
    .Given(() =>new Account()) 
    .When(()=> ...); 
+0

謝謝。這不是一個真正的答案,因爲我的問題似乎沒有這樣的事情,但我認爲這是下一個最好的事情。 –