Итак, я знаю, что когда дело доходит до сценариев пользовательских историй, конкретность - это хорошо . Однако я часто дохожу до момента, когда спрашиваю себя: насколько конкретным должен быть мой сценарий?
Например, для пользовательской истории:
Для того, чтобы участники проекта могли совместно работать над проектом в качестве менеджера проекта , один, чтобы быть удобным при написании спецификаций BDD. Где что-то вроде scottTheProjectManager вместо projectManagerStub:
- больше соответствует реальному миру (у нас нет заглушек, работающих в качестве менеджеров проектов ... или нет?)
- легче ссылаться, когда это необходимо в контексте этой спецификации (в противном случае я буду продолжать говорить «тот менеджер проекта» или «руководитель проекта, который зарегистрировал проект» ... и т. д.
Прав ли я в своем заключении? Вредит ли мне эта специфика, когда в истории произойдут изменения?
Большое спасибо!
ОбновлениеВопрос выше касается не только наличия имен людей вместо имен ролей , но и замены всех заполнителей в вашем сценарии с именами реальных экземпляров. А на реальных экземплярах я не Это означает, что у нас действительно есть некто по имени Скотт, работающий менеджером проекта, он просто дает имена абстрактным заполнителям, чтобы реализовать вышеупомянутые преимущества.
Я попытаюсь показать, как эти преимущества реализуются, включив следующий код, который представляет полная спецификация стиля BDD с использованием фреймворка StoryQ
[TestFixture] public class ProjectRegistrationSpecs { [Test] public void ProjectRegistration() { new Story("Project Registration") .InOrderTo("allow project members to collaborate over a project") .AsA("project manager") .IWant("to be able to register new projects") .WithScenario("New Project Registration") .Given(ScottIsAProjectManager) .And(StackoverflowIntegrationProjectHasNeverBeenRegistered) .When(ScottRegistersStackoverflowIntegrationProjectSpecifyingJaneAsAnAnalyst) .Then(StackoverflowIntegrationProjectShouldAppearInJanesListOfProjects) .Execute(); } //Since Scott and Jane are just instances that have meaning in the context of this user story only, they're defined private private ProjectManager scottTheProjectManager; private Project stackOverFlowIntegrationProject; private Employee janeTheAnalyst; //Initialize the stubs in the constructor public ProjectRegistrationSpecs() { scottTheProjectManager = new ProjectManager() { Id = new Guid("{A1596CFC-5FA5-4f67-AC7E-5B140F312D52}") }; stackOverFlowIntegrationProject = new Project() { Id = new Guid("{F4CD5DDE-861E-4e18-8021-730B7F47C232}"), Name = "Stack Overflow Integration" }; } private void ScottIsAProjectManager() { container.Get
().Repository ().Add(scottTheProjectManager); } private void StackoverflowIntegrationProjectHasNeverBeenRegisteredInTheSystem() { var provider = container.Get (); var project = provider.Repository ().SingleOrDefault(p => p.Name == stackOverFlowIntegrationProject.Name); if (null != project) provider.Repository ().Delete(project); } private void ScottRegistersStackoverflowIntegrationProjectSpecifyingJaneAsAProjectMember() { stackOverFlowIntegrationProject.Members.Add(janeTheAnalyst); scottTheProjectManager.RegisterProject(stackOverFlowIntegrationProject); } //instead of saying something like TheProjectThatWasAddedByTheProjectManagerShouldAppearInTheProjectMembersList, we have: private void StackoverflowIntegrationProjectShouldAppearInJanesListOfProjects() { Assert.That(janeTheAnalyst.Projects.Any(p => p.Id == stackOverFlowIntegrationProject.Id)); } }