标签: sinon

在没有 babel 的情况下对原生 ES 模块的导出进行存根

我正在使用 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 模块?

node.js sinon ecmascript-6 ava es6-modules

13
推荐指数
1
解决办法
8122
查看次数

undefined | 0 | ReferenceError:严格模式禁止隐式创建全局属性'csrf_token'

所以,这是我遇到的一个非常有趣的问题.

我目前正在构建一个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中,因为我认为它是"正确的事情"

有没有人有这方面的更多信息?我提前感谢任何细节!

javascript ruby-on-rails backbone.js jasmine sinon

12
推荐指数
1
解决办法
1万
查看次数

使用Sinon在javascript中存储Redis交互

我在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,或者这甚至可能?

javascript mocha.js redis node.js sinon

12
推荐指数
1
解决办法
4529
查看次数

已经被对象断言调用

函数我正在监视,接收对象作为参数.我需要声明函数是使用对象的某些属性调用的.

例如:我的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被称为).现在我需要确保已将正确的对象传递给函数.我只关心 foobar属性,即我必须为参数的特定属性设置匹配.怎么样?

upd:sinon.match()似乎适用于简单对象.我们提高吧,不是吗?

如果我想将zap函数包含在断言中怎么办?我该如何工作?

javascript unit-testing sinon sinon-chai

12
推荐指数
1
解决办法
6035
查看次数

将整个班级存入Sinon进行测试

序言:我已经阅读了很多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)

javascript unit-testing node.js sinon

12
推荐指数
1
解决办法
3896
查看次数

Jest Mock功能和Sinon间谍有什么区别

我正在用Jest嘲笑一个函数,文档说他们真的是'间谍'.我也看过在SinonJS中使用间谍,但我发现两者之间没有明显区别.如果他们服务于同一目的,有没有理由选择一个而不是另一个?

Jest Mock功能

SinonJS

javascript sinon jestjs

12
推荐指数
1
解决办法
4951
查看次数

可以在单个测试中两次存根方法以返回不同的结果吗?

我想重新存根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)

javascript unit-testing stub sinon

12
推荐指数
1
解决办法
6054
查看次数

如何将webpack的require.ensure存根?

我使用webpack的代码拆分功能(require.ensure)来减少我的React应用程序的初始包大小,方法是从异步加载的单独包中加载页面加载时不可见的组件.

这很好用,我在编写单元测试时遇到了麻烦.

我的测试设置基于Mocha,ChaiSinon.

以下是我到目前为止所尝试的代码的相关摘录:

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?

javascript mocha.js sinon reactjs webpack

12
推荐指数
1
解决办法
630
查看次数

如何使用sinon存储用typescript编写的类的私有方法

我正在为一个公共方法编写单元测试,而这个方法又调用了用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)

任何帮助,将不胜感激.谢谢

unit-testing node.js sinon typescript

12
推荐指数
1
解决办法
4087
查看次数

在单元测试期间无法模拟admin.firestore()

我正在阅读如何为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)

我已经尝试了各种各样的东西来存根,但我失败了

  1. 结果firestore is not a function:

        Object.defineProperty(admin, "firestore", {
            get: function () {
                return 32;
            }
        });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 根本不模拟firestore()并调用失败的原始函数:

        sinon.stub(admin, 'firestore').returns({get() { }});
    
    Run Code Online (Sandbox Code Playgroud)
  3. TypeError:不能存根不存在的自有属性get

       firestoreStub …
    Run Code Online (Sandbox Code Playgroud)

javascript unit-testing sinon firebase-admin google-cloud-firestore

12
推荐指数
1
解决办法
2249
查看次数