我在让一个简单的 Jest 测试起作用时遇到了很多麻烦。 Jest 坚持认为我的 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)
});
});
});
知道为什么 jest 会认为这没有被调用吗?我一直在四处寻找,似乎有一些关于 dontMock() 和 mock() 的错误。
最佳答案
正如 Wagner 提到的,您需要在测试之外全局要求 jquery。您的组件正在使用 $ 的全局版本,因此添加 var $ = require('jquery')
不会将 jquery 添加到全局变量 $。
您也没有模拟 ajax 调用。
在测试 React 时,我通过简单地重新定义 $: 来避免加载 jquery 的问题
window.$ = {ajax: jest.genMockFunction()}
因此,只要除了 ajax 调用之外不需要 jquery,这一行将模拟 jquery 根并模拟 ajax 调用。
关于javascript - JestJs认为没有调用ajax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26227225/