你如何引起期望停止RSpec的执行?

时间:2016-08-30 22:18:20

标签: ruby-on-rails rspec

我想测试一个类在RSpec中接收类方法调用:

describe MyObject do
  it "should create a new user" do 
    expect(User).to receive(:new)
    MyObject.new.doit
  end
end

class MyObject
  def doit
    u = User.new
    u.save
  end
end

问题在于期望不会停止执行。它只是简化类方法.doit并继续执行。

期望的效果是确保User.new返回nil。因此,当我们到达User.save的下一行时,它会失败,因为没有用户对象可以调用.save

我希望一旦RSpec期望得到满足就停止执行 - 我该怎么做?

nb的

这只是一个说明性示例 - 虽然expect to change适用于User.new,但这不是我需要测试的实际代码

2 个答案:

答案 0 :(得分:1)

这个and_call_original有一个很好的方法:

expect(User).to receive(:new).and_call_original

答案 1 :(得分:0)

根据您的测试说明,您正在测试是否已创建记录,在这种情况下,我建议您执行此操作:

library(ggplot)    
myData <- aggregate(mtcars$mpg,
                        by = list(cyl = mtcars$cyl, gears = mtcars$gear),
                        FUN = function(x) c(mean = mean(x), sd = sd(x),
                                            n = length(x)))
    myData <- do.call(data.frame, myData)
    myData$se <- myData$x.sd / sqrt(myData$x.n)

colnames(myData) <- c("cyl", "gears", "mean", "sd", "n", "se")
myData$names <- c(paste(myData$cyl, "cyl /",
                        myData$gears, " gear"))

myData$sign <- c(1, -1, 1, 1, -1, 1, -1, 1)

myDataN <- mutate(myData, mean_new = mean*sign, se_new=se+30)
dodge <- position_dodge(width = 0.9)
limits <- aes(
              ymax = myDataN$mean_new + myDataN$se_new,  
              ymin = myDataN$mean_new - myDataN$se_new)
                  #ymax = myDataN$mean_new, #for upper
                  #ymin = myDataN$mean_new) #for lower


p <- ggplot(data = myDataN, aes(x = names, y = mean_new, fill = names))

p + geom_bar(stat = "identity", position = dodge) +
  geom_errorbar(limits, position = dodge, width = 0.25) +
  theme(axis.text.x=element_blank(), axis.ticks.x=element_blank(),
        axis.title.x=element_blank())

或者如果你想确保它只创建一个:

expect {
  MyObject.new.doit
}.to change{User.count}