Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 RSpec实例双重期望值和默认参数值_Ruby_Unit Testing_Rspec - Fatal编程技术网

Ruby RSpec实例双重期望值和默认参数值

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:

我试图为一个类创建一个单元测试,该类依赖于我创建的WebClient对象,该对象发出经过身份验证的web请求。我已经创建了WebClient的一个实例,我正在将其传递到对象中,并正在模拟它的一个公共方法make_json_request,其中包含一些带期望值的集合,以便它可以返回一些散列,我可以在单元测试中使用

在我测试的第一个方法中,该方法的调用方式如下:

@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' }