Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么ruby为方法调用返回'true'?_Ruby On Rails_Ruby_Rspec - Fatal编程技术网

Ruby on rails 为什么ruby为方法调用返回'true'?

Ruby on rails 为什么ruby为方法调用返回'true'?,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,这是一个关于Rspec的简短教程:关于Rspec助手的解释。以下是示例的代码: class Dog attr_reader :good_dog, :has_been_walked def initialize(good_or_not) @good_dog = good_or_not @has_been_walked = false end def walk_dog @has_been_walked = true end end

这是一个关于Rspec的简短教程:关于Rspec助手的解释。以下是示例的代码:

class Dog
   attr_reader :good_dog, :has_been_walked

   def initialize(good_or_not)
      @good_dog = good_or_not
      @has_been_walked = false
   end

   def walk_dog
      @has_been_walked = true
   end
end

describe Dog do
   def create_and_walk_dog(good_or_bad)
      Dog.new(good_or_bad).walk_dog
   end

   it 'should be able to create and walk a good dog' do
      dog = create_and_walk_dog(true)

      expect(dog.good_dog).to be true
      expect(dog.has_been_walked).to be true
   end
end
当我运行此操作时,会出现以下错误:

NoMethodError:true:TrueClass的未定义方法“good_dog”
#./dor.rb:22:in‘block in>’


我不明白调用Dog.new()如何返回一个true:TrueClass对象而不是一个简单的Dog。

这是因为
create\u and\u walk\u Dog
返回的是
walk\u Dog
方法返回的

要从
create\u and\u walk\u dog
方法返回一只狗,您需要

describe Dog do
   def create_and_walk_dog(good_or_bad)
      dog = Dog.new(good_or_bad)
      dog.walk_dog
      dog
   end

   it 'should be able to create and walk a good dog' do
      dog = create_and_walk_dog(true)

      expect(dog.good_dog).to be true
      expect(dog.has_been_walked).to be true
   end
end
或扩展期望块:

describe Dog do
   it 'should be able to create and walk a good dog' do
      dog = Dog.new(true)

      expect(dog.good_dog).to be true
      expect {
        dog.walk_dog
      }.to change(dog, :has_been_walked).from(false).to true
   end
end

我认为为了清楚起见,您可以/应该在这里使用RSpec方法,而不是RSpec文件中包含的完整方法定义。让您的_walk_dog_方法返回我在这里看到的另一个答案中建议的self-like可以修复您当前的RSpec实现,但不会帮助您在潜在应用程序中的任何其他地方流动。假设情况下,坏狗50%的时间随机返回“假狗”或根本不合作

class Dog
  attr_reader :good_dog, :has_been_walked

  def initialize(good_or_not)
    @good_dog = good_or_not
    @has_been_walked = false
  end

  # Command to attempt walking a dog.
  # 
  # @api public
  # 
  # @example
  #   good_dog = Dog.new(true)
  #   good_dog.walk_dog # => Will always return true for good dogs.
  #   bad_dog = Dog.new(false)
  #   bad_dog.wal_dog # => 50/50 chance of true or false
  def walk_dog
    return @has_been_walked = true if @good_dog
    [true, false].sample
  end
end

describe Dog do

  let(:good_dog) { Dog.new(true) }

  it 'should always be able to walk a good dog' do
    expect(good_dog.walk_dog).to be true
  end

  it 'should track if the dog has been walked' do
    expect {
      good_dog.walk_dog
    }.to change(dog, :has_been_walked).from(false).to true
  end

end
这也是一个值得讨论的问题,但是你也应该根据规范只声明一件事,除非你是在打db或者做一些相对耗时的事情


另外,它们都是好狗Brent

我会非常小心地使用w3ii作为参考网站,因为它看起来质量相当低。还有更好的方法。您还可以通过添加
self
作为其中的最后一行代码,使
walk\u dog
成为一个可链接的方法。这是使用
点击(&:block)
方法的一个好例子,该方法生成给定的
,然后返回对象本身。在这种情况下:
Dog.new(good\u或bad)。点击(&:walk\u Dog)