Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 我是否应该开设一门课程';s实例变量只用于测试验证?_Ruby_Oop_Bdd - Fatal编程技术网

Ruby 我是否应该开设一门课程';s实例变量只用于测试验证?

Ruby 我是否应该开设一门课程';s实例变量只用于测试验证?,ruby,oop,bdd,Ruby,Oop,Bdd,我是BDD新手,我发现了很多实例,在这些实例中,我只向attr_访问器添加实例变量,这样我的测试就可以轻松地验证它们是否处于应该处于的状态。但是这感觉有点脏,因为没有其他类需要这些信息,所以我只是在测试中公开它。这是标准还是设计不好的标志 例如,我有一个集合类,它存储一个对象,然后将其提交给一个批处理数组。导入结束时,使用批处理数组将批处理插入数据库。但在任何时候都不需要检查批次的状态。但在测试中,我希望确保批次处于我认为的状态,因此我打开该变量进行检查。没有在代码中检查的事实是真正的问题吗?是

我是BDD新手,我发现了很多实例,在这些实例中,我只向attr_访问器添加实例变量,这样我的测试就可以轻松地验证它们是否处于应该处于的状态。但是这感觉有点脏,因为没有其他类需要这些信息,所以我只是在测试中公开它。这是标准还是设计不好的标志


例如,我有一个集合类,它存储一个对象,然后将其提交给一个批处理数组。导入结束时,使用批处理数组将批处理插入数据库。但在任何时候都不需要检查批次的状态。但在测试中,我希望确保批次处于我认为的状态,因此我打开该变量进行检查。没有在代码中检查的事实是真正的问题吗?

是否使用
实例变量\u get
作为您的选项

>> class Foo
..   def initialize
..     @foo = 'bar'
..     end
..   end #=> nil
>> Foo.new.instance_variable_get(:@foo) #=> "bar"

不要那样做

这太深了。在另一个“已接受”答案的帖子中,查看@Andy和@Michael的评论

不要编写查看代码单元内部的单元测试。如果从对象的外部接口看不到它,那么就不需要进行单元测试。您将从代码的行为转变为它如何实现该行为,并且您不希望测试深入到该级别,因为它们在证明代码做了它应该做的事情方面没有提供任何真正的价值

考虑如果有人重新编写代码,为了使它更可读,改变内部的名称,你需要更新多少测试。或者找到一种更好的方法来做任何事情,所有的实例变量都会被改变。。代码单元仍然可以很好地工作,但是单元测试将失败


或者,如果进行了调整内部变量向接口报告的方式的更改,代码可能会被有效地破坏,但是查看实例变量内部值的测试不会报告任何失败。

或者:
Foo.new.instance_eval{@Foo}
这是不明智的。实例变量表示类的内部状态。你的测试应该只检查外部行为。@Andy:我从来没说过这是个好主意,我只是向OP展示了他是如何做到的。你总是可以朝自己的脚开枪,这并不意味着你不应该知道枪是什么。@Michael是的,但OP的问题是“应该”他这么做。@Andy:我不同意。如果你认为值得投反对票,那是你的意见,我只是陈述了我的意见。至少你给出了一个理由,这比很多人的理由要好,所以:-)