作为一名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”;通过参考找到所有项目。 :) –