Ember-CLI-Mirage实施JSON:API?

时间:2015-12-29 16:39:25

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

难以接受几次失败并想知道我是否正确理解幻影:

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

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

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

2.是海市蜃楼强制执行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

我尝试将服务器响应更改为json:api格式,如上一个示例here所示,但这看起来与我的实际服务器响应完全不同,导致我的测试失败,因为我的应用程序无法解析有效负载有了这种结构。任何提示或建议必须得到赞赏。

2 个答案:

答案 0 :(得分:4)

  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来调试您的测试。

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

答案 1 :(得分:0)

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

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

  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()使验收测试更容易排除故障。