Ruby on rails 理解突变失败
我有以下ActiveRecord模型类方法: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
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
如果我手动进行同样的更改,我的测试就会失败——正如预期的那样
所以我的问题是:我如何编写一个“杀死”这种突变的单元测试?免责声明,我是突变作者 此类情况的迷你备忘单:
:shortlink
的值不会因参数shortlink
而改变)。因此,您在测试中需要做的唯一一件事就是添加一个案例,其中参数shortlink
与您在测试中的期望值有关
如果将
self
作为:shortlink
查找器的值传递与传递当前测试的参数具有相同的效果,请尝试使用不同的参数。在AR中强制查找程序中的值可能很棘手,您的模型有可能强制到与您正在测试的参数相同的值。感谢您提供的详细答案!关于我的示例,有些东西我仍然不理解(实际上有一些事情,但我会保持简洁)。将参数更改为self
会导致ActiveRecord:;语句无效
异常。这是因为您提到的强制问题,还是突变体希望我的测试涵盖的一个极端情况?这意味着您的测试根本不验证值是什么。该值可以替换为self(一个方便的随机对象的替代对象),这意味着该方法的该部分没有规范。@dkubb这是否意味着mockingfind_by代码>,在我的测试中添加关于参数值的断言或其他内容?能给我举一个这样的规范的例子吗?如果你不想触碰数据库,请给#find_by!(shortlink:your_参数)
就可以了。而您的规范只能保证您的方法#find_by_shortlink
转换为finder。这就足够了,因为您应该信任#find#u by代码>已经存在。