我一直在使用TDD / SSR一段时间。我正在尝试过渡到BDD:context,因为和Asserts。
我正在使用Rhino Mocks进行隔离,现在我正在努力学习语法。这是我到目前为止所得到的(注:ContextSpecification class source):
public static class DocumentIdAdapterTests {
public class DocumentIdAdapterContext : ContextSpecification {
protected IDocumentIdAdapter _documentIdAdapter;
protected ISettings _settingsMock;
protected override void Context() {
_settingsMock = MockRepository.GenerateMock<ISettings>();
_documentIdAdapter = new DocumentIdAdapter(_settingsMock);
}
}
[TestClass]
public class when_single_document_url_is_created : DocumentIdAdapterContext {
protected override void BecauseOf() {
_settingsMock.Stub(x => x.DocumentServiceBaseUrl).Return("fooOutput");
_documentIdAdapter.GetDocumentServiceSingleDocumentUrl("fooInput");
}
[TestMethod]
public void the_settings_should_provide_the_document_service_base_url() {
_settingsMock.AssertWasCalled(x => { var ignored = x.DocumentServiceBaseUrl; });
}
}
}
我应该在哪里设置我的存根?例如,我应该在哪里存根DocumentServiceBaseUrl属性将返回的值?我现在正在使用我的SinceOf方法,但是我应该在Context方法中做到这一点吗?
答案 0 :(得分:0)
这取决于哪些情境会影响你班级的行为,而这只是你班级运作所必需的。
如果您总是从特定的上下文开始(例如,您的文档服务始终位于特定的URL),那么您可以在构造函数或设置方法中进行设置。
如果您的上下文会影响您的行为(您称之为OU),那么每个上下文都需要一个新的场景。这通常是驱动场景的因素 - 产生不同结果的上下文组合(断言)。
一个好的BDD技巧是寻找不同的上下文。想一想,“我的代码是否应该始终如此?是否存在产生不同结果的上下文?”这为您提供了很好的对话启动器,可以发现您不了解代码的任何内容,并允许您为每个新的行为方面提供示例(单元测试)。