在验收测试中访问它后获取路由模型

Posted

技术标签:

【中文标题】在验收测试中访问它后获取路由模型【英文标题】:Get model of route after visiting it in acceptance test 【发布时间】:2015-11-13 21:18:31 【问题描述】:

我正在尝试编写验收测试,以查看模型中我访问的路线的某个属性是否等于我所断言的。

我不会使用这条路由将信息输出到页面,而是使用 ember 插件将其中的一部分保存到本地存储。所以通常我意识到我可以使用find() 在页面上查找一个元素并检查它的内容以确定模型是否正在解析,但这不适用于这种情况。

在验收测试中我有这个设置(使用 mirage btw)

test('Returns a user', function(assert) 
  // Generate a user
  var user = server.create('user',first_name: 'Jordan');
  // Visit the index page with the users short_url
  visit('/' + user.short_url);
  var route = this.application.__container__.lookup('route:index');

  // Assert that the model the user we created by checking the first name we passed in
  assert.equal(route.model.first_name,'Jordan','Model returns user with first name Jordan');
);

但是当我运行测试时,结果显示为undefined

更新:

在尝试了 Daniel Kmak 的答案后,我仍然无法通过。这是我正在使用的路由代码

import Ember from 'ember';
import LocalUser from 'bidr/models/user-local';

export default Ember.Route.extend(
    localUser: LocalUser.create(),
    navigationService: Ember.inject.service('navigation'),
    activate() 
        this.get('navigationService').set('navigationMenuItems', []);
    ,
    beforeModel() 
        this.localUser.clear();
    ,
    model(params) 
        var self = this;
        return this.store.queryRecord('user',short_url: params.short_url).then(function(result)
            if(result)
            self.set('localUser.user', 
                "id": result.get('id'),
                "first_name": result.get('first_name'),
                "active_auction": result.get('active_auction'),
                "phone": result.get('phone')
            );
            // transition to event page
            self.transitionTo('items');
             else 
                self.transitionTo('home');
            
        );
    
);

测试看起来像这样

import Ember from 'ember';
import  module, test  from 'qunit';
import startApp from 'bidr/tests/helpers/start-app';


module('Acceptance | index route', 
  beforeEach: function() 
    this.application = startApp();
  ,

  afterEach: function() 
    Ember.run(this.application, 'destroy');
  
);

test('Returns a user', function(assert) 
  var user = server.create('user',first_name: 'Jordan');

  visit('/' + user.short_url);

  var route = this.application.__container__.lookup('route:index');

  andThen(function() 
    assert.equal(route.get('currentModel.first_name'),'Jordan','Model returns user with first name Jordan');
  );
);

所有代码在开发中都可以正常工作。

【问题讨论】:

我会尝试使用controller.model 而不是route.model 以避免异步行为 那么如何让控制器在测试中可以访问?我尝试将查找更改为controller:index,但我仍然无法访问它 您能否分享您访问的路由的路由器代码以及 user.short_url 的示例值以及该路由的模型函数? 我已经更新了我的答案。它应该可以工作。 【参考方案1】:

好的,所以我已经在 Ember 中进行了测试,看来你应该很擅长在 andThen hook 中获取模型:

test('returns a user', function(assert) 
  visit('/'); // visit your route

  var route = this.application.__container__.lookup('route:index'); // find your route where you have model function defined

  andThen(function() 
    console.log(route.get('currentModel')); // your model value is correct here
    assert.equal(currentURL(), '/'); // make sure you've transitioned to correct route
  );
);

获取您的代码应该可以正常运行:

test('Returns a user', function(assert) 
  var user = server.create('user',first_name: 'Jordan');

  visit('/' + user.short_url);

  var route = this.application.__container__.lookup('route:index');

  andThen(function() 
    assert.equal(route.get('currentModel.first_name'),'Jordan','Model returns user with first name Jordan');
  );
);

另外需要注意的是,您可以通过route.currentModel 属性访问模型。

对于我的模型:

export default Ember.Route.extend(
  model() 
    return Ember.RSVP.hash(
      simple: 'simpleValue',
      promise: Ember.RSVP.resolve(5)
    );
  
);

andThenconsole.log(route.get('currentModel')); 我得到了:

Object simple: "simpleValue", promise: 5

已记录。

【讨论】:

当我更改为 TypeError: Cannot read property 'model' of undefined 并将路由变量记录到控制台返回未定义。但是使用route:index 将路由记录到控制台会返回路由类。 还是不及格,我把我的路由代码和当前的测试加在问题里

以上是关于在验收测试中访问它后获取路由模型的主要内容,如果未能解决你的问题,请参考以下文章

在验收测试中覆盖海市蜃楼响应?

期末作业验收

Yii2 验收测试。在每次测试后回滚在验收测试中所做的所有更改

如何使用 NServiceBus 验收测试从 saga 处理程序获取反馈

如何在 Codeception 验收测试中为 <input type="email"> 获取 WebGuy->fillField?

验收测试和 CI