我正在使用 AVA + sinon 来构建我的单元测试。由于我需要 ES6 模块并且我不喜欢 babel,因此我在整个项目中使用 mjs 文件,包括测试文件。我使用“--experimental-modules”参数来启动我的项目,并在测试中使用“esm”包。以下是我的ava配置和测试代码。
"ava": {
"require": [
"esm"
],
"babel": false,
"extensions": [
"mjs"
]
},
// test.mjs
import test from 'ava';
import sinon from 'sinon';
import { receiver } from '../src/receiver';
import * as factory from '../src/factory';
test('pipeline get called', async t => {
const stub_factory = sinon.stub(factory, 'backbone_factory');
t.pass();
});
Run Code Online (Sandbox Code Playgroud)
但我收到错误消息:
TypeError {
message: 'ES Modules cannot be stubbed',
}
Run Code Online (Sandbox Code Playgroud)
如何在没有 babel 的情况下存根 ES6 模块?
所以,这是我遇到的一个非常有趣的问题.
我目前正在构建一个backbone.js - Rails应用程序.通常只是为了学习目的而构建它.我(就像任何好的rails dev)在TDD/BDD上做得最好,我遇到了水豚问题.
我有一个仅仅测试root_path工作的集成规范(Backbone历史记录启动,显示初始信息等等).
require 'spec_helper'
describe "RentalProperties", js: true do
describe "GET /" do
it "should show a list of properties" do
visit root_path
eventually{page.should have_content("Something")}
end
end
end
Run Code Online (Sandbox Code Playgroud)
我正在使用jasmine,sinon和capybara/rspec/webkit运行测试.我正在松散地遵循thinkbot上的"Rspec on Rails"一书(顺便说一句很棒的书),以及本教程:http://tinnedfruit.com/2011/03/03/testing-backbone-apps-with-jasmine- sinon.html.
运行上述规范时,我遇到了这个错误:
undefined|0|ReferenceError: Strict mode forbids implicit creation of global property 'csrf_token'
Run Code Online (Sandbox Code Playgroud)
我花了很长时间对其进行排序,因为这个错误确实没有google-able.
最终我在JS中使用"use strict-mode"偶然发现了.本质上,这将使用一些新的EMCA5脚本约定.它将捕获更多编码bloopers,并使您无法访问全局变量.所有美好的事物.
所以我检查一下,在我的sinon.js文件中,我看到:
"use strict";
Run Code Online (Sandbox Code Playgroud)
在文件的第36行.瞧,我注意到这条线,我的测试工作得很好.
这是我的问题:为什么使用严格搞乱csrf?我假设这与我的rails布局中的csrf_meta_tags有关.如果可能的话,我想把这条线放回到sinon js中,因为我认为它是"正确的事情"
有没有人有这方面的更多信息?我提前感谢任何细节!
我在node.js工作.我的应用程序通过node_redis模块与Redis交互.我正在使用mocha和sinon自动测试我的应用程序.我的应用程序看起来像这样:
...snip
var redisClient = redis.createClient(redisPort, redisHost);
var someValue = redisClient.get("someKey");
return someValue;
....
Run Code Online (Sandbox Code Playgroud)
我想将调用存根到redisClient.get().要做到这一点,我还需要将调用存根到redis.createClient() - 我想......这是我的测试代码:
...
var redis = require("redis");
var redisClient;
...
sinon.stub(redisClient, 'get').returns("someValue");
sinon.stub(redis, "createClient").returns(redisClient);
...
assert.equal(redis_client_underTest.call_to_redis(), "someValue");
...
Run Code Online (Sandbox Code Playgroud)
测试失败了 AssertionError: false == "someValue"
我该如何存根redisClient,或者这甚至可能?
函数我正在监视,接收对象作为参数.我需要声明函数是使用对象的某些属性调用的.
例如:我的SUT有:
function kaboom() {
fn({
foo: 'foo',
bar: 'bar',
zap: function() { ... },
dap: true
});
}
Run Code Online (Sandbox Code Playgroud)
在我的测试中,我可以这样做:
fnStub = sinon.stub();
kaboom();
expect(fnStub).to.have.been.called;
Run Code Online (Sandbox Code Playgroud)
这是有效的(很高兴知道fn被称为).现在我需要确保已将正确的对象传递给函数.我只关心 foo和bar属性,即我必须为参数的特定属性设置匹配.怎么样?
upd:sinon.match()似乎适用于简单对象.我们提高吧,不是吗?
如果我想将zap函数包含在断言中怎么办?我该如何工作?
序言:我已经阅读了很多SO和博客文章,但没有看到任何回答这个特定问题的内容.也许我只是在寻找错误的东西......
假设我正在开发一个WidgetManager可以操作Widget对象的类.
如何使用sinon测试WidgetManager是否Widget正确使用API而不需要拉入整个Widget库?
基本原理:WidgetManager的测试应该与Widget类分离.也许我还没有编写Widget,或者Widget可能是一个外部库.无论哪种方式,我应该能够测试WidgetManager正确使用Widget的API而无需创建真实的Widgets.
我知道sinon模拟只能在现有的类上工作,据我所知,sinon存根也需要该类存在才能被存根.
为了使它具体化,我将如何测试Widget.create()在下面的代码中使用单个参数'name'调用一次?
// file: widget-manager.js
function WidgetManager() {
this.widgets = []
}
WidgetManager.prototype.addWidget = function(name) {
this.widgets.push(Widget.create(name));
}
Run Code Online (Sandbox Code Playgroud)
// file: widget-manager-test.js
var WidgetManager = require('../lib/widget-manager.js')
var sinon = require('sinon');
describe('WidgetManager', function() {
describe('#addWidget', function() {
it('should call Widget.create with the correct name', function() {
var widget_manager = new WidgetManager();
// what goes here?
});
it('should push one widget onto the widgets list', function() { …Run Code Online (Sandbox Code Playgroud) 我正在用Jest嘲笑一个函数,文档说他们真的是'间谍'.我也看过在SinonJS中使用间谍,但我发现两者之间没有明显区别.如果他们服务于同一目的,有没有理由选择一个而不是另一个?
我想重新存根someHandler.getStatus,但我得到了TypeError: Attempted to wrap getStatus which is already wrapped......
it('is a test', function() {
sandbox.stub(someHandler, 'getStatus', function(callback) {
callback(null, {
value: 1
});
});
sandbox.stub(someOtherHandler, 'doSomething', function(callback) {
callback(null);
});
sandbox.stub(someHandler, 'getStatus', function(callback) {
callback(null, {
value: 0
});
});
});
Run Code Online (Sandbox Code Playgroud) 我使用webpack的代码拆分功能(require.ensure)来减少我的React应用程序的初始包大小,方法是从异步加载的单独包中加载页面加载时不可见的组件.
这很好用,但我在编写单元测试时遇到了麻烦.
以下是我到目前为止所尝试的代码的相关摘录:
describe('When I render the component', () => {
let component,
mySandbox;
beforeEach(() => {
mySandbox = sandbox.create();
mySandbox.stub(require, 'ensure');
component = mount(<PageHeader />);
});
describe('the rendered component', () =>
it('contains the SideNav component', () =>
component.find(SideNav).should.have.length(1)
)
);
afterEach(() => mySandbox.restore());
});
Run Code Online (Sandbox Code Playgroud)
运行测试时,我收到以下错误消息:
"在每个"钩子之前"包含SideNav组件":不能存根不存在自己的属性确保
发生这种情况是因为这require.ensure是一种仅存在于webpack包中的方法,但我不是将我的测试与webpack捆绑在一起,也不是我想要的,因为它会产生更多的开销,并且可能会延长测试执行时间.
所以我的问题是:
有没有办法在require.ensure没有通过webpack运行测试的情况下使用Sinon存储webpack?
我正在为一个公共方法编写单元测试,而这个方法又调用了用typescript(Node JS)编写的类的私有方法.
示例代码
class A {
constructor() {
}
public method1() {
if(this.method2()) {
// Do something
} else {
// Do something else
}
}
private method2() {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
现在测试method1()我需要stub方法2()这是一个私有方法.
在这里我正在尝试:
sinon.stub(A.prototype, "method2");
Run Code Online (Sandbox Code Playgroud)
Typescript抛出错误:
Argument of type '"method2"' is not assignable to parameter of type '"method1"'
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.谢谢
我正在阅读如何为firebase模拟谷歌云功能,并且有正确模拟以下代码的问题:
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var db = admin.firestore();
Run Code Online (Sandbox Code Playgroud)
链接中的示例使用以下代码来模拟initializeApp哪些工作正常
admin = require('firebase-admin');
adminInitStub = sinon.stub(admin, 'initializeApp');
Run Code Online (Sandbox Code Playgroud)
现在admin.firestore在firebase-namespace.js中定义如下:
Object.defineProperty(FirebaseNamespace.prototype, "firestore", {
get: function () {
var ns = this;
var fn = function (app) {
return ns.ensureApp(app).firestore();
};
return Object.assign(fn, require('@google-cloud/firestore'));
},
enumerable: true,
configurable: true
});
Run Code Online (Sandbox Code Playgroud)
我已经尝试了各种各样的东西来存根,但我失败了
结果firestore is not a function:
Object.defineProperty(admin, "firestore", {
get: function () {
return 32;
}
});
Run Code Online (Sandbox Code Playgroud)根本不模拟firestore()并调用失败的原始函数:
sinon.stub(admin, 'firestore').returns({get() { }});
Run Code Online (Sandbox Code Playgroud)TypeError:不能存根不存在的自有属性get
firestoreStub …Run Code Online (Sandbox Code Playgroud)javascript unit-testing sinon firebase-admin google-cloud-firestore
sinon ×10
javascript ×8
unit-testing ×5
node.js ×4
mocha.js ×2
ava ×1
backbone.js ×1
ecmascript-6 ×1
es6-modules ×1
jasmine ×1
jestjs ×1
reactjs ×1
redis ×1
sinon-chai ×1
stub ×1
typescript ×1
webpack ×1