2014-10-07 2 views
2

У меня много проблем с получением простого теста для теста. Шутка настаивает на том, что мой Ajax вызов не происходит, с сообщением об ошибке:JestJs думает, что ajax не называется

FAIL authTest.js (1.828s) 
● Authentication: Logging In › it Doesn't currently have a logged in user 
    - Expected Function to be called with { url : 'api/loggedin', type : 'GET', error :  <jasmine.any(function Function() { [native code] })>, success : <jasmine.any(function Function() { [native code] })> }. 
    at Spec.<anonymous> (/Users/ritmatter/reps/spec/authTest.js:13:20) 
    at Timer.listOnTimeout [as ontimeout] (timers.js:110:15) 

Код испытываемое в файле auth.jsx, и это выглядит следующим образом:

loggedIn: function() { 
    return $.ajax({ 
    url: 'api/loggedin', 
    type: 'GET', 
    error: function(xhr, status, err) { 
     return false; 
    }.bind(this), 
    success: function(data) { 
     return true; 
    }.bind(this), 
    }); 
}, 

Тест выглядит так:

/** @jsx React.DOM */ 
"use strict"; 
var React = require('react/addons'); 
var TestUtils = React.addons.TestUtils; 

describe('Authentication: Logging In', function() { 
    it('Doesn\'t currently have a logged in user', function() { 
    var $ = require('jquery'); 
    jest.dontMock('../js/auth.jsx'); 
    var auth = require('../js/auth.jsx'); 
    auth.loggedIn(); 
    expect($.ajax).toBeCalledWith({ 
     url: 'api/loggedin', 
     type: 'GET', 
     error: jasmine.any(Function), 
     success: jasmine.any(Function) 
    }); 
    }); 
}); 

Любая идея, почему шутка будет думать, что это не называется? Я смотрю вокруг, и кажется, что есть некоторые ошибки в отношении dontMock() и mock().

+0

Вы не можете вызвать методы взаимодействия компонентов вне реагирующего компонента, если они не находятся в объекте 'statics: {}'. Однако статические методы не получают доступа к экземпляру компонента. –

+0

Auth - простой объект javascript, а не реагирующий компонент, поэтому я не думаю, что это должно быть проблемой. В этом файле подробно описывается учебник: http://facebook.github.io/jest/docs/tutorial.html#content, за исключением того, что auth - это .jsx-файл, а не файл .js. – ritmatter

+0

Да, это файл .jsx запутан, потому что почему бы не реагировать на метод класса компонента в .jsx вместо .js? –

ответ

0

У меня была аналогичная проблема с компонентом React, который вызывал ajax при инициализации. То, что я нашел, это то, что expect на $ работает только если вам требуется jquery за пределами метода it.

Мой Реагировать компонент и тестовый пример, как эти (они ES6, но вы можете получить идею)

import React from 'react' 
import $ from 'jquery' 

export default class MyComponent extends React.Component { 

    constructor(props) { 
    super(props); 
    this.state = {things:[]}; 
    } 

    componentWillMount() { 
    $.ajax({ 
     url: 'http://localhost:3000/things', 
     success: (result) => this.setState(result), 
     error: (ex) => console.log(ex) 
    }) 
    } 

    render() { 
    //stuff 
    } 
} 

и испытание

jest.dontMock('../components/MyComponent') 

import React from 'react' 
import TestUtils from 'react-addons-test-utils' 
import $ from 'jquery' 

const Wall = require('../components/MyComponent'); 

describe('MyComponent',() => { 

    it('calls the things end point',() => { 
    const myComp = TestUtils.renderIntoDocument(<MyComponent />) 

    expect($.ajax).toBeCalledWith({ 
     url: 'http://localhost:3000/things', 
     success: jasmine.any(Function), 
     error: jasmine.any(Function) 
    }) 
    }); 
}); 
1

Как уже упоминалось Wagner, вам нужно требовать JQuery во всем мире, вне вашего теста. Ваш компонент использует глобальную версию $, поэтому добавление var $ = require('jquery') не делает ничего с точки зрения добавления jquery к глобальной переменной $.

Вы также не издевались над вызовом ajax.

При тестировании реакции, избежать проблем с загрузкой JQuery просто переосмысление $:

window.$ = {ajax: jest.genMockFunction()} 

Таким образом, до тех пор, пока вы не нужны JQuery для чего-нибудь еще, кроме вызова Ajax, это одна строка будет имитировать корень jquery и высмеивать вызов ajax.

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