Ruby RSpec实例双重期望值和默认参数值
我试图为一个类创建一个单元测试,该类依赖于我创建的WebClient对象,该对象发出经过身份验证的web请求。我已经创建了WebClient的一个实例,我正在将其传递到对象中,并正在模拟它的一个公共方法make_json_request,其中包含一些带期望值的集合,以便它可以返回一些散列,我可以在单元测试中使用 在我测试的第一个方法中,该方法的调用方式如下:Ruby RSpec实例双重期望值和默认参数值,ruby,unit-testing,rspec,Ruby,Unit Testing,Rspec,我试图为一个类创建一个单元测试,该类依赖于我创建的WebClient对象,该对象发出经过身份验证的web请求。我已经创建了WebClient的一个实例,我正在将其传递到对象中,并正在模拟它的一个公共方法make_json_request,其中包含一些带期望值的集合,以便它可以返回一些散列,我可以在单元测试中使用 在我测试的第一个方法中,该方法的调用方式如下: @web_client.make_json_request '/api/v1/endpoint', query: { territory:
@web_client.make_json_request '/api/v1/endpoint', query: { territory: territory_id, status: 'active' }
我正在设置我的instance_double,如下所示:
当我尝试在rspec中运行测试时,我得到以下错误:
Failure/Error: state = client.current_state
#<InstanceDouble(WebClient) (anonymous)> received :make_json_request with unexpected arguments
expected: ("/api/v1/endpoint", {:query=>{:territory=>1, :status=>"active"}})
got: ("/api/v1/endpoint", {:query=>{}})
Diff:
@@ -1,2 +1,2 @@
-["/api/v1/endpoint", {:query=>{:territory=>1, :status=>"active"}}]
+["/api/v1/endpoint", {:query=>{}}]
我知道,在实际传递带有适当值的命名参数的行中,它没有达到预期,我不知道如何解决这个问题。在我使用double的其他情况下,我没有这个问题——只有在这一种情况下,命名参数带有默认值。我做错了什么
编辑:我被要求提供正在测试的方法的完整代码:
def load_entities(territory_id)
path = '/api/v1/endpoint'
@web_client.make_json_request path, query: { territory: territory_id, status: 'active' }
.select { |d| d['status'] == 'active' }
end
编辑2:完整等级库:
describe Loader do
let(:territory_id) { 1 }
let(:web_client) {
web_client = instance_double('WebClient')
expect(web_client).to receive(:make_json_request)
.with('/api/v1/endpoint', query: { territory: territory_id, status: 'active' })
.and_return nil
web_client
}
describe '.current_state' do
it 'returns a State' do
client = Loader.new territory_id, web_client: web_client
state = client.current_state
expect(state).to be_a State
end
end
案件结案!罪魁祸首:语法错误 更改此项:
@web_client.make_json_request path, query: { territory: territory_id, status: 'active' }
.select { |d| d['status'] == 'active' }
为此:
@web_client.make_json_request(path, query: { territory: territory_id, status: 'active' }).select { |d| d['status'] == 'active' }
因为您是在查询对象上执行select,而不是在make_json_请求的结果上执行。它不会从您的查询中选择任何内容,如规范所示。您能提供测试方法的完整代码吗?我现在就做。谢谢,现在请提供完整规范的it块及其父描述块的前/后回调:似乎您没有正确使用instance\u double。最后一件事:controller从何处获取@web\u client实例变量?我在构造函数中传递instance double。否则,该值在方法参数中是默认值。非常感谢!这让我快发疯了。我对编程并不陌生,但对Ruby来说是个新手,最近可选的paren让我很头疼。非常感谢。嗯,我有多年的Ruby经验,老实说,我从来没有使用过可选参数或命名参数。好吧,要么是你随着时间/经验的推移变得更加保守,要么是我需要开始遵循花哨的趋势:欢迎你!
@web_client.make_json_request path, query: { territory: territory_id, status: 'active' }
.select { |d| d['status'] == 'active' }
@web_client.make_json_request(path, query: { territory: territory_id, status: 'active' }).select { |d| d['status'] == 'active' }