Ruby on rails 理解突变失败

Ruby on rails 理解突变失败,ruby-on-rails,ruby,tdd,mutation-testing,Ruby On Rails,Ruby,Tdd,Mutation Testing,我有以下ActiveRecord模型类方法: def self.find_by_shortlink(shortlink) find_by!(shortlink: shortlink) end 当我用这种方法运行突变体时,我被告知有17个突变体,16个在测试运行后仍然“存活” 以下是一种“活”突变: ----------------------- evil:Message.find_by_shortlink:/home/peter/projects/kaboom/app/models/mes

我有以下ActiveRecord模型类方法:

def self.find_by_shortlink(shortlink)
  find_by!(shortlink: shortlink)
end
当我用这种方法运行突变体时,我被告知有17个突变体,16个在测试运行后仍然“存活”

以下是一种“活”突变:

-----------------------
evil:Message.find_by_shortlink:/home/peter/projects/kaboom/app/models/message.rb:29:3f9f2
@@ -1,4 +1,4 @@
 def self.find_by_shortlink(shortlink)
-  find_by!(shortlink: shortlink)
+  find_by!(shortlink: self)
 end
如果我手动进行同样的更改,我的测试就会失败——正如预期的那样


所以我的问题是:我如何编写一个“杀死”这种突变的单元测试?

免责声明,我是突变作者

此类情况的迷你备忘单:

  • 确保您的规格现在是绿色的
  • 如图所示更改代码
  • 试着观察一个不想要的行为变化。
  • 不可能?
  • (可能)将突变作为更好的代码
  • (不太可能)向变种人报告错误
  • 发现行为更改:将其编码为测试,或更改测试以覆盖该行为
  • 重新运行突变体以验证突变的死亡
  • 确保变种人确实列出了你添加的用于该变种的测试。如果没有,重组测试,以覆盖所选测试中的突变主题
  • 现在谈谈你的情况:如果你把变异应用到你的代码中。该参数被忽略,基本上是硬编码的(finder中使用的键
    :shortlink
    的值不会因参数
    shortlink
    而改变)。因此,您在测试中需要做的唯一一件事就是添加一个案例,其中参数
    shortlink
    与您在测试中的期望值有关


    如果将
    self
    作为
    :shortlink
    查找器的值传递与传递当前测试的参数具有相同的效果,请尝试使用不同的参数。在AR中强制查找程序中的值可能很棘手,您的模型有可能强制到与您正在测试的参数相同的值。

    感谢您提供的详细答案!关于我的示例,有些东西我仍然不理解(实际上有一些事情,但我会保持简洁)。将参数更改为
    self
    会导致
    ActiveRecord:;语句无效
    异常。这是因为您提到的强制问题,还是突变体希望我的测试涵盖的一个极端情况?这意味着您的测试根本不验证值是什么。该值可以替换为self(一个方便的随机对象的替代对象),这意味着该方法的该部分没有规范。@dkubb这是否意味着mocking
    find_by,在我的测试中添加关于参数值的断言或其他内容?能给我举一个这样的规范的例子吗?如果你不想触碰数据库,请给
    #find_by!(shortlink:your_参数)
    就可以了。而您的规范只能保证您的方法
    #find_by_shortlink
    转换为finder。这就足够了,因为您应该信任
    #find#u by已经存在。