【问题标题】:Ember-CLI-Mirage enforcing JSON:API?Ember-CLI-Mirage 强制执行 JSON:API?
【发布时间】:2016-04-03 14:00:30
【问题描述】:

遇到了几次失败,想知道我是否正确理解 Mirage:

1.在 ember-cli-mirage 中,我定义的服务器响应应该反映我的实际服务器返回的内容是否正确?例如:

this.get('/athletes', function(db, request) {
  let athletes = db.athletes || [];
  return {
    athletes: athletes,
    meta: { count: athletes.length }
  }
});

我正在使用自定义序列化程序,上面的内容与我的服务器响应格式相匹配,以获取此路由上的请求,但是,在两次测试中,我遇到了两次失败并出现此错误:normalizeResponse must return a valid JSON API document: meta must be an object

2. mirage 是否强制执行 json:api 格式,这样做是因为我设置测试的方式吗?

例如,我有几个测试访问上述/athletes 路由,但是当我使用如下所示的异步调用时会发生故障。我很想知道正确覆盖服务器响应行为的适当方法,以及为什么 normalizeResponse 错误出现在控制台中进行 2 次测试但仅导致以下测试失败。

test('contact params not sent with request after clicking .showglobal', function(assert) {
  assert.expect(2);
  let done = assert.async();
  server.createList('athlete', 10);

  //perform a search, which shows all 10 athletes
  visit('/athletes');
  fillIn('.search-inner input', "c");

  andThen(() => {
    server.get('/athletes', (db, request) => {
      assert.notOk(params.hasOwnProperty("contacts"));
      done();
    });

    //get global athletes, which I thought would now be intercepted by the server.get call defined within the andThen block
    click('button.showglobal');
  });
});

结果:

✘ Error: Assertion Failed: normalizeResponse must return a valid JSON API document:
    * meta must be an object
         expected true

我尝试按照上一个示例 here 中的建议将我的服务器响应更改为 json:api 格式,但这看起来与我的实际服务器响应完全不同,并且导致我的测试失败,因为我的应用程序不使用它解析有效负载结构体。任何提示或建议都必须赞赏。

【问题讨论】:

    标签: ember.js json-api ember-cli-mirage


    【解决方案1】:
    1. 你是对的。您上面显示的模拟是否发生故障?在我看来,它总是会以对象的形式返回 meta,因此请在发出请求后通过查看控制台来验证响应是否为您认为的样子。

      如果您想在测试期间看到响应,请在测试中输入 server.logging = true

      test('I can view the photos', function() {
        server.logging = true;
        server.createList('photo', 10);
      
        visit('/');
      
        andThen(function() {
          equal( find('img').length, 10 );
        });
      });
      
    2. 不,Mirage 与您的特定后端无关,尽管它确实带有一些默认值。我会再次尝试在此处启用server.logging 来调试您的测试。

      另外,当针对模拟服务器编写asserts 时,请在测试开始时定义路由处理程序,如the example from the docs 所示。

    【讨论】:

    • 嘿 Sam,我能够使用您的建议解决我的失败问题,将模拟服务器移到测试的顶部。我已经在下面发布了我的答案。再次感谢您的快速响应(以及 Mirage!)。
    【解决方案2】:

    根据 Sam 的建议,我能够通过第二次测试。我的困惑是如何针对我必须访问并执行操作的路线的请求参数进行断言。我不得不访问/athletes,单击不同的按钮,这些操作中的每一个都向 /athletes 路由发送单独的请求(和参数)。这就是为什么我试图在 andThen 块中重新定义路由处理程序(即,在我已经使用 mirage/config 文件中的路由定义访问了路由之后)。

    不喜欢我的解决方案,但我处理它的方式是将我的断言移出路由处理程序,而是将请求的值分配给顶级变量。这样,在我的最后一个 andThen() 块中,我就能够断言最后一次调用 /athletes 路由。

      assert.expect(1);
      //will get assigned the value of 'request' on each server call
      let athletesRequest;
    
      //override server response defined in mirage/config in order to
      //capture and assert against request/response after user actions
      server.get('athletes', (db, request) => {
        let athletes    = db.athletes || [];
        athletesRequest = request;
    
        return {
          athletes: athletes,
          meta: { count: athletes.length }
        };
      });
    
      //sends request to /athletes
      visit('/athletes');
      andThen(() => {
        //sends request to /athletes
        fillIn('.search-inner input', "ab");
        andThen(function() {
          //sends (final) request to /athletes
          click('button.search');
          andThen(function() {
          //asserts against /athletes request made on click('button.search')                   assert.notOk(athletesRequest.queryParams.hasOwnProperty("contact"));
          });
        });
      });
    

    我仍然收到与meta is not an object 相关的控制台错误,但它们并没有阻止测试通过。使用 server.logging = true 让我看到 meta 确实是所有 FakeServer 响应中的对象。

    再次感谢 Sam 的建议。 server.logging = truepauseTest() 使验收测试更容易排除故障。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 2015-10-25
      • 2019-10-13
      • 1970-01-01
      相关资源
      最近更新 更多