修改实例变量的Rspec测试方法

时间:2015-12-31 10:54:29

标签: rspec

如何测试实例方法是否正确修改实例变量?

鉴于课程:

class MyClass
  attr_reader :ary
  def initialize
    @ary = []
  end
  def update (value)
    @ary << value
  end
end

我如何测试#update是否正确修改@ary?
到目前为止,我有:

describe MyClass do
  before { @my_class = MyClass.new }
  describe '#update' do
    it 'should correctly update the value' do
       expect(@my_class.update('some_value')).to #what comes next?

匹配器正在考虑评估#update的返回值,而不是@ary的值,这就是我想要的。

2 个答案:

答案 0 :(得分:1)

这是一个简明的例子

<style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>

与初始代码相比的一些注释。首先,您可以依靠describe MyClass do describe "#update" do it "appends the argument to the array" do subject.update(value = 'some_value') expect(subject.ary).to eq([value]) end end end subject定义为

subject

好像有

described_class.new

describe MyClass do
  subject { described_class.new }

  describe "#update" do
    ...
  end
end

基本上意味着

describe MyClass do
  describe "#update" do
    subject = described_class.new
  end
end

如果您只想测试实例,请使用describe MyClass do describe "#update" do subject = MyClass.new end end 。不要在操作之前使用设置实例变量。

以下一行

subject

本质上是

的快捷方式
subject.update(value = 'some_value')
expect(subject.ary).to eq([value])

它帮助我不写两次预期的字符串。其余的应该很容易理解。

如果相关,您可能还想测试返回值。

value = 'some_value'
subject.update(value)
expect(subject.ary).to eq([value])

答案 1 :(得分:0)

首先调用方法,然后检查boolean valid = true; if(s1.equals("") || s2.equals("") || s3.equals("") || s4.equals("") || s5.equals("") || s6.equals("")) { Toast.makeText(getApplicationContext(),"Enter all Details first", Toast.LENGTH_SHORT).show(); valid = false; } if(!s5.matches("[A-Za-z0-9]+")) { e5.setError("Username cannot contain special characters"); valid = false; } if(s5.length()<6) { e5.setError("Username must be a minimum of 6 characters."); valid = false; } if(!(s3.contains("@")&& s3.contains("."))) { e3.setError("Enter a valid Email Id"); valid = false; } if(!s6.equals(s7)) { e7.setError("Passwords dont match"); valid = false; } if(s2.length()!=10) { e2.setError("Please enter a valid 10 digit number"); valid = false; } if (valid) { Validate v2=new Validate(); v2.store_values(s1,s2,s3,s4,s5,s6,s8); v2.execute(); }

@ary