作为 BDD 和 MSpec 的初学者,我仍然不太确定与 BDD 相关的最佳实践和良好习惯,尤其是与 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);
};
}
最佳答案
这可能不是世界对规范的看法,而是您和您的团队/同行/“必须在您之后阅读此代码的人”可以从中获益。
从一个开发者的角度来看:
我的大小写和命名遵循代码中可读的内容。 HTML 摘录的好处是您最终会获得可读的规范。我读过的很多内容都集中在所有小写字母等方面;但是,我的措辞与您的非常相似:适当、可读的大小写。
对于像这样的一对一,行为对于可读性非常好。我使用基类来建立上下文,并为重复的、常见的断言设置期望和行为。
Establish
一直意味着“在我测试之前设置环境”。在你的两个例子中,我可能会像这样重写它:Establish context = () => var reader = new DataItemReader(new MemoryStream( TestData.GetNormalDataItemAsByteArray()), Encryption.None)); Because of = () => result = reader.ReadItem(); Cleanup after = () => reader.Dispose();
由于规范关注的是“读取”的 DataItem,因此操作或
Because
就是这样。同样,偏好问题。我使用可重复使用的静态工厂,我在其中手工创建了 stub 或具有 stub /模拟引擎(如 FakeItEasy http://code.google.com/p/fakeiteasy/ )。在我看来, stub 的内容/创建对实际测试影响不大, stub 应该被视为某种程度上的黑盒(这就是我们编写测试的原因,对吧?)。
我会单独关注每个属性(如您所拥有的那样),以确保它们符合我的期望。如果您曾经覆盖 Equals,您可能会检查不属于规范或不相关的属性的相等性。
我不确定是否存在任何管理“最佳实践”(github 站点上有一些提示:https://github.com/machine/machine.specifications#readme)。通过查看其他使用 MSpec 的项目并观察他们如何处理他们的规范,我发现我的一些编码风格发生了变化。
关于bdd - 这个 MSpec 测试可以改进吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6999746/