Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有特定的用户故事场景是邪恶的吗?_C#_Bdd_User Stories_Storyq - Fatal编程技术网

C# 有特定的用户故事场景是邪恶的吗?

C# 有特定的用户故事场景是邪恶的吗?,c#,bdd,user-stories,storyq,C#,Bdd,User Stories,Storyq,所以我知道,当涉及到用户故事场景时,这是一个非常重要的问题。然而,我经常会问自己:我的场景应该有多具体 例如,对于用户故事: 为了允许项目成员在项目上进行协作,作为项目经理,我希望能够注册新项目 我们可以有以下场景: 如果某个项目从未在系统中注册过,则当项目经理注册该项目时,注册的项目应显示在指定成员的项目列表中 或者我们可以更具体地说: 鉴于Scott是项目经理,且stackoverflow集成项目从未在系统中注册,当Scott注册stackoverflow集成项目并指定Jane为项目成员时,

所以我知道,当涉及到用户故事场景时,这是一个非常重要的问题。然而,我经常会问自己:我的场景应该有多具体

例如,对于用户故事:

为了允许项目成员在项目上进行协作,作为项目经理,我希望能够注册新项目

我们可以有以下场景:

如果某个项目从未在系统中注册过,则当项目经理注册该项目时,注册的项目应显示在指定成员的项目列表中

或者我们可以更具体地说:

鉴于Scott是项目经理,且stackoverflow集成项目从未在系统中注册,当Scott注册stackoverflow集成项目并指定Jane为项目成员时,stackoverflow集成项目应出现在Jane的项目列表中

我发现在编写BDD规范时,第二个“更具体”的方法非常方便。使用scottTheProjectManager而不是projectManagerStub是:

  • 与现实世界更为一致(我们没有作为项目经理工作的存根……或者我们有吗?)
  • 在该规范上下文中,无论何时需要,都更容易参考(否则,我会一直说“该项目经理”或“注册该项目的项目经理”…等等
我的结论正确吗?当故事发生变化时,这种特殊性会伤害我吗

非常感谢


更新

上面的问题不仅仅是关于使用人名而不是角色名,而是关于用真实实例的名称替换场景中的所有占位符。真实实例并不是说我们实际上有一个叫Scott的人担任项目经理,它只是为抽象占位符命名,以实现上述好处

我将尝试通过包含以下代码来展示这些好处是如何实现的,这些代码表示使用StoryQ框架的完整BDD样式规范

[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<IDataProvider>().Repository<ProjectManager>().Add(scottTheProjectManager);
    }
    private void StackoverflowIntegrationProjectHasNeverBeenRegisteredInTheSystem()
    {
        var provider = container.Get<IDataProvider>();
        var project = provider.Repository<Project>().SingleOrDefault(p => p.Name == stackOverFlowIntegrationProject.Name);
        if (null != project)
        provider.Repository<Project>().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));
    }
}
[TestFixture]
公共类项目注册规范
{
[测试]
公开注册()
{
新故事(“项目注册”)
.InOrderTo(“允许项目成员在项目上协作”)
.AsA(“项目经理”)
.IWant(“能够注册新项目”)
.WithScenario(“新项目注册”)
.给定(项目经理)
.和(StackOverflowIntegrationProject从未注册)
.When(ScottreRegistersStackOverflowIntegrationProjectSpecifyingJaneAsanaAnalyst)
。然后(StackOverflowIntegrationProjects应在所有项目中出现)
.Execute();
}
//因为Scott和Jane只是在这个用户故事的上下文中有意义的实例,所以它们被定义为私有的
私人项目经理scottTheProjectManager;
私人项目stackOverFlowIntegrationProject;
私人雇员janeTheAnalyst;
//初始化构造函数中的存根
公共项目注册规范()
{
scottTheProjectManager=新项目管理器()
{
Id=新Guid({A1596CFC-5FA5-4f67-AC7E-5B140F312D52}”)
};
stackOverFlowIntegrationProject=新项目()
{
Id=新Guid({F4CD5DDE-861E-4e18-8021-730B7F47C232}),
Name=“堆栈溢出集成”
};
}
私人项目经理()
{
container.Get().Repository().Add(scottTheProjectManager);
}
私有void StackOverflowIntegration项目从未在系统()中注册
{
var provider=container.Get();
var project=provider.Repository().SingleOrDefault(p=>p.Name==stackOverFlowIntegrationProject.Name);
if(null!=项目)
provider.Repository().Delete(项目);
}
private void ScottRegistersStackoverflowIntegrationProjectSpecifyingJaneAsAProjectMember()的私有无效
{
stackOverFlowIntegrationProject.Members.Add(janeTheAnalyst);
scottTheProjectManager.RegisterProject(stackOverFlowIntegrationProject);
}
//我们没有说项目经理添加的项目应该出现在项目成员列表中,而是:
私有void StackOverflowIntegrationProjects应出现在JanesListofProjects()中
{
Assert.That(janeTheAnalyst.Projects.Any(p=>p.Id==stackOverFlowIntegrationProject.Id));
}
}
“用户角色”是一个非常强大但很难掌握的概念。如果做得好,它可以引导您走向简化、优化的用户体验。如果做得不好,它会占用时间,并给团队中的人一个互相大喊大叫的主观理由

有很多关于这个主题的文献,虽然大多数都不是针对BDD的


我能给出的最重要的一条建议是,在定义你的人物角色时,重要的是要非常具体地说明什么让他们高兴/激励/挫败他们,但这种特殊性应该是从整个世界或总体计算的角度来看的——不要将这些东西与你的产品的特定方面或个人对未来的渴望联系在一起产品,因为否则1)人物角色将很快过时,需要重新创建;2)人物最终将被用作促进个人愿望的主观武器,而不是作为基于事实的工具来改进,从而为真实的人提供最好的产品。这说起来容易做起来难。

而对于领域专家来说,拥有指定特定用户湾的aproach更容易理解(因为 领域专家知道斯科特(项目经理)和他的任务),但我认为这一观点违反了:一个人可以扮演多重角色

Scott还可能参与市场营销,项目经理Magret可能会
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(AProjectManager, "Scott")
                    .And(AnUnRegisteredProject, "Stack Overflow Integration")
                .When(TheProjectManagerRegistersTheProject)
                    .And(TheProjectManagerSpecifiesATeamMember, "Jane")
                .Then(ThenTheProjectShouldAppearInTheTeamMembersListOfProjects)
    .Execute();