2

我如何防御性地编写 rspec 测试,以便在一个场景中至少必须满足一个期望,但接受其他人的失败?(不改变输入)。通过列出多个期望AND很容易,但是如何表达呢?OR

例如,一个用户有很多帖子,用户Bob破解了一个表单,因此当他提交他的创建帖子表单时,它会发送用户Dunc的 id 。目前,应用程序忽略传递的Dunc id,并在Bob创建帖子时使用Bob的 id 。所以我们可以测试新创建的 Post 是否有Bob的 user_id。但是,如果将来对代码进行重构,使其返回错误消息而不是假设Bob的 id,那么该测试将错误地失败。我想测试意图,而不是实现。

所以我需要测试是否没有创建帖子,或者如果创建了一个帖子,它是为Bob的。

这个例子很简单,可以通过测试解决

expect { run }.not_to change( Post.where(user_id: @other_user.id), :count )

但是我正在寻找通用解决方案,在更复杂的情况下可能有很多条件。Rspec 中的“OR”是如何实现的?(或者不可能?)

4

1 回答 1

4

我不认为这是可能的。

当您说您将测试实现而不是示例中的意图时,我确实认为您是错误的。

当您编写测试时,您会测试结果是否符合您的期望。

创建用户与返回错误消息完全不同。

在我看来,说这样的话会很奇怪:当我这样做时,我期望会发生这样、那样、那样或那样的事情。

在我看来,您应该编写一个测试,测试在您发送正确参数时是否创建了用户,另一个测试处理当用户尝试发送非法参数时会发生什么。

于 2013-08-13T11:40:42.653 回答