Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何解决与Sinon发生的争议?_Javascript_Promise_Sinon - Fatal编程技术网

Javascript 如何解决与Sinon发生的争议?

Javascript 如何解决与Sinon发生的争议?,javascript,promise,sinon,Javascript,Promise,Sinon,当参数是延迟对象时,是否可以让sinon解析参数 考虑这一点: function needToTest() { var isInitialized = q.defer(); var importantResult; var publicStuff; publicStuff.isInitialized = isInitialized.promise.then(function(res) { importantResult = res; }); var someCla

当参数是延迟对象时,是否可以让sinon解析参数

考虑这一点:

function needToTest() {
  var isInitialized = q.defer();
  var importantResult;
  var publicStuff;
  publicStuff.isInitialized = isInitialized.promise.then(function(res) {
    importantResult = res;
  });
  var someClass = new SomeClass(isInitialized);
  publicStuff.getResult = function() {
    return importantResult;
  };
  return publicStuff;
}
我使用q作为promise库,但它并不重要。 SomeClass看起来像这样:

function SomeClass(promise) {
  this.foo = function() {
    //
  };
  //after some initializing:
  var result = true; //or false
  promise.resolve(result);
}
describe('test', function() {
  var needToTestInstance;
  beforeEach(function(done) {
    new Squire()
      .mock('someClassMock', someClassMock)
      .require(['needToTest'], function(module) {
        needToTest = module;
        //Need to get the needToTest().isInitialized to resolve with a value!
        done();
      });
  });
  describe('importantResult', function() {
    expect(needToTestInstance.getResult()).to.be(true);
  });
});
也许这个模拟应该有某种功能来解决承诺,但这就是我目前所做的:

  var someClassMock = sinon.stub().withArgs(q.defer());
  someClass.prototype.foo = sinon.stub().returns('foo');
  return someClassMock;
最后,我尝试使用sinon和Squire创建一个测试用例,如下所示:

function SomeClass(promise) {
  this.foo = function() {
    //
  };
  //after some initializing:
  var result = true; //or false
  promise.resolve(result);
}
describe('test', function() {
  var needToTestInstance;
  beforeEach(function(done) {
    new Squire()
      .mock('someClassMock', someClassMock)
      .require(['needToTest'], function(module) {
        needToTest = module;
        //Need to get the needToTest().isInitialized to resolve with a value!
        done();
      });
  });
  describe('importantResult', function() {
    expect(needToTestInstance.getResult()).to.be(true);
  });
});

有可能在测试中的任何时候得到初始化以解决问题吗?

你没有传递承诺,你传递的是一个延迟对象。你是对的,我需要稍微更新这个问题,但主要问题仍然是,我如何在测试用例中解决这个问题?你的
needToTest
非常令人困惑。什么是当前的
以及当前的
在哪里。是否使用初始的
?为什么
getResult
没有在任何地方使用,为什么使用
importantResult
变量而不只是使用promise?您需要使用一个在第一个参数上调用
.resolve()
的函数来模拟
SomeClass
。这就像打回电话一样。然而,我通常建议,不要回绝承诺,也不要以收回/延期作为理由。您可能需要重新考虑您的总体设计-这也可能使
SomeClass
needToTest
更易于测试。如何使用一个函数模拟SomeClass,该函数使用第一个参数执行某些操作?我确实创建了someClassMock,但是在我的测试中调用someClassMock.returnsArg(0)时,注释行似乎没有返回承诺。可能是因为同一对象的不同初始化?