Php 启动Behat功能/故事的正确方式

Php 启动Behat功能/故事的正确方式,php,domain-driven-design,bdd,behat,Php,Domain Driven Design,Bdd,Behat,我开始使用BDD,经过一些阅读后,我发现它与DDD非常匹配 现在我有了这个域,机构拥有位置,由受让人将其添加到机构,受让人是被分配为组织经理的用户 我仍然不知道它应该是什么样子,但这项功能听起来像:作为机构的受让人,我必须能够为组织增加职位 我正在考虑的代码(对于代码优先的方法很抱歉)如下所示: if ($institution->isAssignee($user)) { $institution->addPlace(/* properties*/); } 现在,我应该如何

我开始使用BDD,经过一些阅读后,我发现它与DDD非常匹配

现在我有了这个域,
机构
拥有
位置
,由
受让人
将其添加到
机构
,受让人是被分配为组织经理的
用户

我仍然不知道它应该是什么样子,但这项功能听起来像:作为机构的受让人,我必须能够为组织增加职位

我正在考虑的代码(对于代码优先的方法很抱歉)如下所示:

if ($institution->isAssignee($user)) {
    $institution->addPlace(/* properties*/);
}
现在,我应该如何编写功能及其场景?我是否应该将作为受让人离开,然后离开它?还是应该有多个场景?情况会是怎样的

编辑:

因此,我暂时不进行用户权限检查,而是启动了第一个功能,然后是实现规范。可以找到代码

这个功能不是很简单吗?当然,这是my domain的核心功能,但我甚至没有在我的功能中提到无法添加相同位置的位置的情况,但我在
InstitutionSpec

前进:如果我想编辑机构的
位置
,有什么更好的方法:

$place = $institution->getPlace($placeId);
$place->editWhatever(/***/);


检查用户是否有权向
机构添加场所
似乎是另一个人的
受限上下文
BC
)问题,如
授权
。通过查询
授权BC
以从具有
受让人“
角色的用户创建
受让人,可以在
应用层
抗破坏层
机构集合
之外执行此检查

在这个BC中,只有一个
受让人
,可能是一个
值对象
,它有一个
用户ID
和一个
名称

另外,你的
BDD
测试应该按照
BC
进行划分,而且应该按照
Aggregate

进行划分

通常,在一开始,大多数开发人员都考虑重用所有步骤。您只是隐藏了这个场景应该显示的内容—阻止添加具有相同协调的新位置。在我看来,第一步应该是:

然后像这样润色你们的场景,帮助你们找到更好的命名方式,展示问题

正如您所问的:
这个功能不是很简单吗?
-如果每个场景都正确地按功能划分-那么不是-您是按行为设计代码的。如果这只是您需要的,那么可以,但您还应该考虑功能的边界条件-添加下一个场景

关于最后一部分,使用“编辑位置”-考虑实体。 我听到了一个很好的例子:D

您喜欢什么:

  • 到笼子->抓狮子->用下巴抓肚子->把食物放进去->把肚子放回去->离开

  • 去笼子->把食物扔给狮子->离开
当你们试图抓住这个机构的“胃”时,第一个选择就是打破这个基础


我认为,在您的上下文中,第二种选择更好。

确定用户是否是给定机构的受让人可能不像角色检查那么容易。我通常都支持身份和访问BC,但在这里,支持上下文需要引入额外的抽象集,例如在特定上下文或特定目标中扮演角色。在需要关联的BC中直接建模关联可能更容易。
$institution->editWhateverInPlace($placeId, /** edits **/);
Given an institution named "Test institution" with places:
| name       | coordination  |
| Test Place | 54.222,24.333 |