标签: sinon

Cypress:使用正则表达式断言存根函数的参数

我有一个存根方法,在赛普拉斯控制台中打印以下结构:

myMethod('start', Object{5})

我知道该对象有一个键,segmentB-> 当控制台将其记录在存根中时,我看到它,但我不想开始在存根中进行断言

我想断言,segmentB 的值以'MPI_'

我虽然将“应该通过匹配来调用”和 Cypress.sinon 断言结合起来,如下所示,但它不起作用。

 cy
        .get('@myMethod')
        .should('be.calledWithMatch', 'start', {
          segmentB: Cypress.sinon.match(/^MPI_/)
      })
Run Code Online (Sandbox Code Playgroud)

.should('beCalledWithMatch', 'start')或在没有可变部分的情况下断言对象的键/值对是可行的,但我很感激使用正则表达式进行断言的任何帮助。

regex assertion sinon sinon-chai cypress

4
推荐指数
1
解决办法
317
查看次数

Sinon假服务器不自动响应

嗨我正在使用fetch测试一个集合,当我调用它时,只有在调用server.response之后才能从假服务器中得到答案.我得到了所需的结果.

这是为什么 ?

我的代码

  beforeEach( function() {
    server = sinon.fakeServer.create();
    server.autoRespond = true;
    colhedoraList = new ColhedoraList();
  });

.
.
.
    var spy       = sinon.spy(colhedoraList, 'parse');

    server.respondWith("GET", "getColhedoraInfo",
      [200, {"Content-Type": "application/json"},
      '[{"id":"1","talhaoAtual":1,"posicionamentos":[{"lat":-23.9317401,"lng":-50.2210379,"elevadorLigado":true,"horario":"2012-09-21T11:27:58Z"},{"lat":-23.931544,"lng":-50.2161884,"elevadorLigado":true,"horario":"2012-09-21T11:28:02Z"}]}]']);

    colhedoraList.fetch({add: true});
    server.respond();
    expect(spy).toHaveBeenCalled();
    expect(spygmaps).toHaveBeenCalledTwice();
    expect(colhedoraList.get(1).get('talhaoAtual')).toEqual(1);    <<< ALL EXPECTS FAIL, If I don't call respond().
Run Code Online (Sandbox Code Playgroud)

javascript sinon

3
推荐指数
1
解决办法
1913
查看次数

如何使用sinon.js模拟/存根回调函数?

我想用QUnit和Sinon.Js编写单元测试.我有一个应用程序,用户可以点击按钮和模式对话框来处理下载一些文件.用户可以关闭对话框,它会触发一个方法来运行以重置某些变量.我的测试代码:

$(function() {
    $.fn.copy_button = function(){};

    ln_download_view = new DownloadModalView();
    ln_download_view.modal = {'modal': function() {}};
    var download_modal_dialog = $('.download-modal');
    download_modal_dialog.modal = function(param){};
    var modal_mock = sinon.mock(ln_download_view.modal);
    var download_modal_dialog_mock = sinon.mock(download_modal_dialog);

    //Should be inserted, because ln_download_view.modal is mocked
    //The close button even handler
    $('#btn_close_modal').click(function(){
        download_modal_dialog.modal('hide');
    });

    //Dirty stuff to do after the window closes
    //Basicly the click triggers this event handler
    $('.download-modal').on('hide',function() {
        window.clearInterval(window.periodicalTimer);
    });

    $('div .option-container').click(function() {
        if(!$(this).hasClass("selected-option"))
        {
            $('div #option-presenting').toggleClass("selected-option");
            $('div #option-editing-and-presenting').toggleClass("selected-option");

            $('.image').toggle();
        }
    });

    module("views");
    test("Download modal dialog …
Run Code Online (Sandbox Code Playgroud)

javascript qunit sinon

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

使用sinon使用必需的参数声明特定的存根调用

假设您正在测试一个函数,该函数将使用不同的参数多次调用依赖项:

var sut = {
    ImportantFunction: function(dependency){
        dependency("a", 1);
        dependency("b", 2);
    }
};
Run Code Online (Sandbox Code Playgroud)

使用QUnit + Sinon 并假设调用的顺序并不重要,我可以编写以下测试,确保函数按预期调用依赖项:

test("dependency was called as expected", function () {
    var dependencyStub = sinon.stub();

    sut.ImportantFunction(dependencyStub);

    ok(dependencyStub.calledTwice, "dependency was called twice");            
    sinon.assert.calledWith(dependencyStub, "a", 1);
    sinon.assert.calledWith(dependencyStub, "b", 2);
});
Run Code Online (Sandbox Code Playgroud)

但是,如果订单很重要并且我希望测试将其考虑在内,该怎么办?使用QUnit + Sinon编写此类测试的最佳方法是什么?

我使用了以下方法,但是我正在丢失由sinon断言提供的描述性失败消息(显示预期值和实际值).为此,我只是手动添加了一些描述性消息,但它没有使用具有预期值和实际值的失败消息(并且必须手动维护).

ok(dependencyStub.firstCall.calledWith("a", 1), "dependency called with expected args 'a', 1");
ok(dependencyStub.secondCall.calledWith("b", 2), "dependency called with expected args 'b', 2");
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以sinon.assert.calledWith像第一次或第二次呼叫那样使用特定呼叫的断言?

这个小提琴的样本设置

unit-testing qunit sinon

3
推荐指数
2
解决办法
5749
查看次数

我如何同时存根和间谍

所以我正在测试一个调用另一个函数的函数,它返回一个promise,SUT看起来像这样:

fn($modal) -> 
    modalInstance = $modal.open({
       controller: 'myCtrl'
       size: 'lg'
     })

    modalInstance.result.then(updateData)
Run Code Online (Sandbox Code Playgroud)

现在如果我需要测试它,我可以从这样的事情开始:

it 'when modal called, results get updated with right data', ->

   $modal = {
      open: sinon.stub().returns({ 
          result: $q.when([1, 2, 3]) 
      })
   }

   fn($modal)
Run Code Online (Sandbox Code Playgroud)

然后检查它updatedData是否等于[1,2,3]

但是我还要确保$modal.open已经调用并且正确的参数已经传递给它.我怎么做?

我不仅需要存根方法而且还要监视它,我是否应该模拟整个$modal?你能用正确的语法帮助我吗?

当我做这样的事情时:

mMk  = sinon.mock($modal)
mMk.expects('open')
Run Code Online (Sandbox Code Playgroud)

诗乃对我大喊: TypeError: Attempted to wrap open which is already stubbed

javascript unit-testing mocha.js sinon angularjs

3
推荐指数
1
解决办法
524
查看次数

使用SinonJS捕获抛出的错误

我有一个可能会抛出错误的方法,但是我在编写SinonJS/Mocha/Should单元测试用例时遇到了麻烦.

被测样本函数:

function testError(value) {
  if (!value) {
    throw new Error('No value');
    return false;
  }
};
Run Code Online (Sandbox Code Playgroud)

样品测试:

describe('#testError', function() {
  it('throws an error', function() {
    var spy = sinon.spy(testError);
    testError(false);
    spy.threw().should.be.true();
  });
});
Run Code Online (Sandbox Code Playgroud)

这输出:

  #testError
    1) throws an error


  0 passing (11ms)
  1 failing

  1) #testError throws an error:
     Error: No value
      at testError (tests/unit/js/test-error.js:6:14)
      at Context.<anonymous> (tests/unit/js/test-error.js:14:6)
Run Code Online (Sandbox Code Playgroud)

我期待Sinon能够抓住错误并允许我对投掷进行间谍活动,但它似乎没有通过测试.有任何想法吗?

我提到不要sinon.js spys捕获错误?但唯一的解决方案是使用expect.如果可能的话,我更愿意使用单个断言库.

unit-testing mocha.js node.js sinon should.js

3
推荐指数
1
解决办法
8575
查看次数

如何sinon间谍模块导出实用程序功能

在javascript(ES6)中,我有一个实用程序模块,它只包含一些函数,然后在文件的最后,我这样导出它们:

module.exports = {
  someFunction1,
  someFunction2,
  someFunction3,
}
Run Code Online (Sandbox Code Playgroud)

然后我想为这些函数编写单元测试.一些功能相互依赖; 他们以某种方式相互调用,例如,someFunction1可能会调用someFunction2.没有循环问题.

一切都运作良好,直到我需要窥探其中一个函数被调用.我该怎么做?目前我正在使用Chai和Sinon.

在测试文件中,我将整个文件导入为模块:

const wholeModule = require('path/to/the/js/file')
Run Code Online (Sandbox Code Playgroud)

最后,我的测试如下:

it('should call the someFunction2', (done) => {
  const spy = sinon.spy(wholeModule, 'someFunction2')

  wholeModule.someFunction1() // someFunction2 is called inside someFunction1

  assert(spy.calledOnce, 'someFunction2 should be called once')
  done()
})
Run Code Online (Sandbox Code Playgroud)

问题是,测试失败,因为在someFunction1中,someFunction2函数是直接使用的.我将间谍应用于模块对象的功能.但那是一个不同的对象.这是someFunction1的一个例子:

function someFunction1() {
  someFunction2()
  return 2;
}
Run Code Online (Sandbox Code Playgroud)

我知道它为什么不起作用的原因,但我不知道在这种情况下最好的做法是什么呢?请帮忙!

javascript node.js sinon chai

3
推荐指数
1
解决办法
1844
查看次数

在摩卡和JSDOM的JavaScript测试使用的DOMParser

我有一个问题,测试使用window.DOMParser一些javascript

const stripLink = (url) => {
  const parser = new DOMParser()
  const link = parser.parseFromString(unescape(url), 
'text/html').querySelector('a')
  return link ? link.getAttribute('href') : url
}
Run Code Online (Sandbox Code Playgroud)

在摩卡咖啡中测试时会发出警告。

node:22883) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): ReferenceError: DOMParser is not defined
Run Code Online (Sandbox Code Playgroud)

我猜这是因为在节点没有的DOMParser。我该如何解决?我尝试过各种事情,例如

var DOMParser = require('xmldom').DOMParser
sinon.stub(window, 'DOMParser', DOMParser)
Run Code Online (Sandbox Code Playgroud)

想,如果我有XMLDOM解析器它应该工作测试替代window.DOMParser,但事实并非如此。

任何想法如何得到这个工作?

javascript testing mocha.js jsdom sinon

3
推荐指数
2
解决办法
1545
查看次数

Firebase功能:编写单元测试时不能对存储进行存根

我在index.js中有以下函数代码:

var admin = require('firebase-admin');
admin.initializeApp();
admin.storage();
Run Code Online (Sandbox Code Playgroud)

以及以下测试代码:

var assert = require('assert');
var sinon = require('sinon');
describe('Event Sourcing', function() {
  var myFunctions, adminInitStub, adminStorageStub,admin;

  before(() => {
    admin =  require('firebase-admin');
    adminStorageStub = sinon.stub(admin, 'storage');
    adminInitStub = sinon.stub(admin, 'initializeApp');

    myFunctions = require('../index');
  });

  after(() => {
    // Restoring our stubs to the original methods.
    adminInitStub.restore();
    adminStorageStub.restore();
  });

  describe('CREATED', function() {
      it('should return -1 when the value is not present', function() {
            assert.equal(-1, [1,5,3].indexOf(4));
          });
    });
});
Run Code Online (Sandbox Code Playgroud)

由于某些奇怪的原因,我不断收到以下错误,Error: The default Firebase …

mocha.js sinon firebase google-cloud-functions firebase-storage

3
推荐指数
1
解决办法
322
查看次数

如何使用sinon正确模拟ES6类

我希望能够正确测试我的ES6类,它的构造函数需要另一个类,所有这些看起来像这样:

A级

class A {
  constructor(b) {
    this.b = b;
  }

  doSomething(id) {
    return new Promise( (resolve, reject) => {
      this.b.doOther()
        .then( () => {
          // various things that will resolve or reject
        });
    });
  }
}
module.exports = A;
Run Code Online (Sandbox Code Playgroud)

B级

class B {
  constructor() {}

  doOther() {
    return new Promise( (resolve, reject) => {
      // various things that will resolve or reject
    });
}
module.exports = new B();
Run Code Online (Sandbox Code Playgroud)

指数

const A = require('A');
const b = require('b');

const a …
Run Code Online (Sandbox Code Playgroud)

javascript bdd mocha.js node.js sinon

3
推荐指数
2
解决办法
3335
查看次数