- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Rspec 为我的程序做一些测试。在规范中,我将类实例化一次,并使用describes 和contexts 对其执行测试。我遇到了一些有趣的事情,如果 its 似乎在上下文的末尾被评估。例如,给定以下类及其相关规范:
class Tmp
def initialize
@values = {}
end
def modify(new_value1, new_value2)
@values = {:a => new_value1, :b => new_value2}
end
def get_values
return @values
end
end
describe Tmp do
tmp = Tmp.new()
describe "testing something" do
context "change value" do
# First evaluation
tmp.modify("hi", "bye")
it {tmp.get_values.should == {:a => "hi", :b => "bye"}}
# Second evaluation
tmp.modify("bye", "hi")
it {tmp.get_values.should == {:a => "bye", :b => "hi"}}
end
end
end
使用提供的类和规范,结果如下:
F.
Failures:
1) Tmp testing something change value
Failure/Error: it {tmp.get_values.should == {:a => "hi", :b => "bye"}}
expected: {:a=>"hi", :b=>"bye"}
got: {:a=>"bye", :b=>"hi"} (using ==)
Diff:
@@ -1,3 +1,3 @@
-:a => "hi",
-:b => "bye"
+:a => "bye",
+:b => "hi"
# ./spec/tmp_spec.rb:11:in `block (4 levels) in <top (required)>'
Finished in 0.00211 seconds
2 examples, 1 failure
这很有趣,因为 Rspec 似乎使用 tmp 中的值评估第一个 it,因为它位于上下文的末尾。即使在上下文中 tmp 正在改变它的值并且应该通过,Rspec 也会根据变量在结束(我什至在 context 中用局部原始变量尝试过这个并且有类似的经历)。
有没有办法解决这个问题并按顺序评估its?或者至少让以下测试通过?我知道我可以使用不同的变量并且它会起作用,但必须有办法解决这个问题。我还想知道这是否是 Rspec 的预期效果。
更新菲利普的回答
通过在单个 it block 中进行更改,规范通过:
describe Tmp do
describe "do something" do
let(:instance) {Tmp.new}
it 'should be modifiable' do
instance.modify('hi', 'bye')
instance.values.should == {a: 'hi', b: 'bye'}
instance.modify('bye', 'hi')
instance.values.should == {a: 'bye', b: 'hi'}
end
end
end
但如果我使用主题,它似乎会返回并在第一个应该上失败
describe Tmp do
describe "do something" do
let(:instance) {Tmp.new}
subject{instance.values}
it 'should be modifiable' do
instance.modify('hi', 'bye')
should == {a: 'hi', b: 'bye'}
instance.modify('bye', 'hi')
should == {a: 'bye', b: 'hi'}
end
end
end
不知道为什么会这样。至少我看到更改应该在 it block 中以更好地反射(reflect)我们正在测试的更改。
最佳答案
您不应该在 it
、specify
、before
、let
之外创建实例和操作它们和 subject
block 。否则主题和其他变量不会在测试后重置。
下面我使用几种不同的样式重写了您的规范。请参阅内联注释以获取解释。
class Tmp
# Exposes the @values ivar through #values
attr_reader :values
def initialize
@values = {}
end
def modify(new_value1, new_value2)
@values = {a: new_value1, b: new_value2}
end
end
describe Tmp do
#`let` makes the return value of the block available as a variable named `instance` (technically it is a method named instance, but let's call it a variable).
let(:instance) { described_class.new }
# Inside an it block you can access the variables defined through let.
it 'should be modifiable' do
instance.modify('hi', 'bye')
instance.values.should == {a: 'hi', b: 'bye'}
end
# or
# `specify` is like `it` but it takes no argument:
specify do
instance.modify('hi', 'bye')
instance.values.should == {a: 'hi', b: 'bye'}
end
# or
# This is another common way of defining specs, one describe per method.
describe '#modify' do
let(:instance) { described_class.new }
# Here we define the subject which is used implicitly when calling `#should` directly.
subject { instance.values }
before { instance.modify('hi', 'bye') }
it { should == {a: 'hi', b: 'bye' } # Equivalent to calling `subject.should == ...`
end
# or
# When we don't specify a subject, it will be an instance of the top level described object (Tmp).
describe '#modify' do
before { subject.modify('hi', 'bye') }
its(:values) { should == {a: 'hi', b: 'bye' }
end
end
关于ruby - Rspec it{} 评估使用最后一个变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12539299/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!