作爲一名BDD和MSpec初學者,我仍然不太確定與BDD有關的最佳實踐和良好習慣,特別是MSpec。MSpec測試可以改進嗎?
下面的例子可以改進嗎?它是否遵循最佳實踐和良好習慣?
- 是我的規範類和行爲的命名行嗎?
- 我應該在這種情況下使用行爲,還是應該爲規範類使用公共基類?
- 可以在這裏沒有
Establish
嗎? - 我應該使用靜態工廠方法(
TestData
方法)來獲取測試數據還是應該在規範本身中創建數據? - 而不是測試行爲中的每個屬性我可以使用
result.Equals()
但我會測試兩件事情,這是不好的,對不對?
請隨意重構這個例子,你會說更好。
[Subject(typeof(DataItemReader))]
public class When_reading_a_DataItem_from_stream
{
Because of =() =>
{
using (var reader = new DataItemReader(
new MemoryStream(TestData.GetNormalDataItemAsByteArray()), Encryption.None))
{
result = reader.ReadItem();
}
};
Behaves_like<DataItemReader_that_reads_correctly> behavior;
protected static DataItem result;
}
[Subject(typeof(DataItemReader))]
public class When_reading_a_DataItem_from_encrypted_stream
{
Because of =() =>
{
using (var reader = new DataItemReader(
new MemoryStream(TestData.GetNormalDataItemAsByteArrayEncyrpted()), Encryption.Default))
{
result = reader.ReadItem();
}
};
Behaves_like<DataItemReader_that_reads_correctly> behavior;
protected static DataItem result;
}
[Behaviors]
public class DataItemReader_that_reads_correctly
{
protected static DataItem result;
It should_read_the_correct_DataItem =() =>
{
var testItem = TestData.GetNormalDataItem();
result.Property1.ShouldEqual(testItem.Property1);
result.Property2.ShouldEqual(testItem.Property2);
result.Property3.ShouldEqual(testItem.Property3);
};
}
你可以推薦一些使用MSpec的項目,我可以學習嗎? – bitbonk
對於3.我需要在某處調用'reader.Dispose()'。我應該這樣做:'因爲=()=> try {result = reader.ReadItem(); } finally {reader.Dispose(); }' – bitbonk
關於我的頭頂,Fluent NHibernate(https://github.com/jagregory/fluent-nhibernate)使用MSpec。尋找項目的一個好方法可能是打開github並搜索Code/C#和「使用Machine.Specifications」;通過參考找到所有項目。 :) –