2016-06-04 3 views
0

У меня есть mixin, который помогает мне пройти через последовательность шагов. В основном, он смотрит на то, что представляет собой текущий шаг, а затем делает некоторую магию, основанную на этом. Проблема в том, что первая строка функции захватывает this.controllerFor('document'), и я не понимаю, как издеваться над этим вызовом controllerFor. Я знаю, что могу, например, передать {testing: "123"} в .create в тесте. Тогда это даст мне this.get('testing'), но как я издеваюсь над controllerFor? Кроме того, чтобы быть ясным, единственная причина для контроллера. Для вызова - это то, что я могу получить currentStep.Mocking controllerFor в тестах qunit.

Prepare-next.js

setNext: function() { 
    let currentStep = this.controllerFor('document').get('currentStep'); 

    if (currentStep === 'First_step') { 
     //do something 
    } else { 
     //do something else... 
    } 
    // Bunch more stuff happens... 
} 

Prepare-Следующего test.js

import Ember from 'ember'; 
import PrepareNext from 'my-app/mixins/prepare-next'; 
import { module, test } from 'qunit'; 

module('mixin:prepare-next'); 

const PrepareNextObject = Ember.Object.extend(PrepareNext); 
let subject; 


test('#setNext does all the things', function(assert) { 
    subject = PrepareNextObject.create(); 
    subject.setNext(); 
    //assert.equal(foo, bar); 
}); 
+0

Какие утверждения вы хотите сделать? вы можете использовать sinon.js, если вы просто утверждаете, что данная функция вызывается с конкретными аргументами. в противном случае я считаю, что приемочные тесты являются более подходящим уровнем тестирования для такого рода вещей. –

ответ

1

Вы можете заменить controllerFor метод до или в тесте:

import Ember from 'ember'; 
import PrepareNext from '../../../mixins/prepare-next'; 
import { module, test } from 'qunit'; 

module('mixin:prepare-next'); 

const PrepareNextObject = Ember.Object.extend(PrepareNext); 

let subject; 

test('#setNext does all the things', function(assert) { 
    assert.expect(2); 

    subject = PrepareNextObject.create(); 
    subject.controllerFor =() => { 
    assert.ok(true, 'controllerFor called'); 
    return { 
     get() { 
     assert.ok(true, 'Get called'); 
     return 'First_step'; 
     } 
    } 
    }; 
    subject.setNext(); 
    //assert.equal(foo, bar); 
}); 

Working demo.

Смежные вопросы