Sinon: 模拟不能很好地与 onCall 配合使用

创建于 2014-06-12  ·  4评论  ·  资料来源: sinonjs/sinon

我无法模拟使用 onCall 和预期参数。
下面的代码给出了Object #<Object> has no method 'withExactArgs'

var mock = sinon.mock();

mock.exactly(2);
mock.onCall(0).withExactArgs("arg1", "arg2").returns("foo");

mock.verify();

withExactArgs方法可用于存根属性: mock.onCall(0).stub.withExactArguments

这是预期的行为还是错误?

最有用的评论

它既不是预期的行为,也不是错误。 你在混合隐喻。 onCallwithArgs都是识别方法调用的方式。

// So either, 

mock.onCall(0).returns("foo")

// OR

mock.withArgs("arg1", "arg2").returns("foo")

// but not both

由于同样的原因,您的第二个示例存在缺陷,可能应该使用存根重写。

    var stub = sinon.stub();

    stub.withArgs("bar1", "bar2").returns("bar");
    stub.withArgs("foo1", "foo2").returns("foo");

    stub("bar1", "bar2");
    stub("foo1", "foo2");

    sinon.assert.calledTwice(stub);

    // verify the 2 calls
    sinon.assert.calledWithExactly(stub, "bar1", "bar2");
    sinon.assert.calledWithExactly(stub, "foo1", "foo2");

    // verify the 2 calls in order
    sinon.assert.callOrder(
        stub.withArgs("bar1", "bar2"),
        stub.withArgs("foo1", "foo2")
    );

不幸的是, withExactArgs上没有Stub

所有4条评论

似乎它也不适用于 .stub 。 我收到一条错误消息,指出使用错误的参数调用了该方法。 显示第一次调用的参数,但显示第二次调用的要求。 好像它丢弃了 onCall(0)。

var mock = sinon.mock();

mock.exactly(2);
mock.onFirstCall().stub.withExactArgs("bar1", "bar2").returns("bar");
mock.onSecondCall().stub.withExactArgs("foo1", "foo2").returns("foo");

mock("bar1", "bar2");
mock("foo1", "foo2");

mock.verify();

ExpectationError: Anonymous mock received wrong arguments ["bar1", "bar2"], expected ["foo1", "foo2"]

它既不是预期的行为,也不是错误。 你在混合隐喻。 onCallwithArgs都是识别方法调用的方式。

// So either, 

mock.onCall(0).returns("foo")

// OR

mock.withArgs("arg1", "arg2").returns("foo")

// but not both

由于同样的原因,您的第二个示例存在缺陷,可能应该使用存根重写。

    var stub = sinon.stub();

    stub.withArgs("bar1", "bar2").returns("bar");
    stub.withArgs("foo1", "foo2").returns("foo");

    stub("bar1", "bar2");
    stub("foo1", "foo2");

    sinon.assert.calledTwice(stub);

    // verify the 2 calls
    sinon.assert.calledWithExactly(stub, "bar1", "bar2");
    sinon.assert.calledWithExactly(stub, "foo1", "foo2");

    // verify the 2 calls in order
    sinon.assert.callOrder(
        stub.withArgs("bar1", "bar2"),
        stub.withArgs("foo1", "foo2")
    );

不幸的是, withExactArgs上没有Stub

然而...

可以识别对存根的单个调用,即使使用相同的参数多次调用也是如此。 例如

stub.withArgs("foo")
  .onCall(0).returns("a")
  .onCall(1).returns("b");

stub.withArgs("bar")
  .onCall(0).returns("c")
  .onCall(1).returns("d");

如果这有帮助?

@mantoni我认为这个问题可以关闭

此页面是否有帮助?
0 / 5 - 0 等级