sinon用途
- 在测试领域 Test double是很重要的一个概念。Test double主要用在自动化测试领域,会使用简单的对象或者流程模拟对应的行为减少测试的复杂性。
- 用于 JavaScript 的测试监视(spy)、桩(stub)和仿制(mock)功能。不依赖其他类库,兼容任何单元测试框架。
sinon spy(最常用)
- test spy 是这样的一类函数,它可以记录自己被调用的情况,包括传入的参数、返回结果、this 指向和抛出的错误(如果有的话)。test spy 可以是一个匿名函数,也可以是对一个已有函数进行的封装。
- 用于测试callback函数
- 用于spy已知行为的方法
- 创建spy
|
|
sinon API用法
- 判断某函数调用了某些参数:spy.withArgs(arg1[, arg2, …]); e.g. assert(spy.withArgs(42).calledOnce);
- 某函数调用的次数:spy.callCount
- spy.called
- spy.calledTwice spy.calledThrice
- spy.firstCall spy.secondCall spy.thirdCall
- 判断是否在另一个spy之前(后)被调用 spy.calledBefore(anotherSpy);spy.calledAfter(anotherSpy);
- 至少有一次被某个参数调用,参数可以部分匹配:spy.calledWith(arg1, arg2, …);
- 至少有一次抛出异常:spy.threw();
sinon spy实例
|
|
sinon stub
- stub(桩)其实是最抽象最难理解的,Test stubs是一类预编码行为的函数(也是一种 spy)。除了改变stub对象的行为之外,它还支持所有的 spy API。同spy一样,stubs 可以是匿名函数,或者包装已有函数。当使用 stub 包装一个已有函数时,原函数将不会被调用。
- stub用于:
- 在测试中控制一个方法的行为,以强制代码沿特定路径执行。例如测试错误处理时,可以强制一个方法抛出错误。
- 当你希望阻止一个方法被直接调用时(可能是因为这个方法触发了干扰行为,例如 XHR 请求之类的)。
创建stub
- 创建一个匿名的 stub 函数。var stub = sinon.stub();
- 使用一个 stub 函数替代 object.method。原函数可以通过调用 object.method.restore() (或 stub.restore())方法来还原。如果 object.method 不是一个函数,则会抛出一个异常来帮助你避免类型错误。var stub = sinon.stub(object, “method”);
- 使用 func 来替换 object.method,并且被包装在一个 spy 中。object.method.restore() 可以恢复原方法。var stub = sinon.stub(object, “method”, func);
- stub 该对象的所有方法。var stub = sinon.stub(obj);
stub API,详情
- stub.withArgs(arg1[, arg2, …]);
- stub.returns(obj);
- stub.throws(); 例: var callback = sinon.stub(); callback.withArgs(1).throws(“TypeError”);
- stub.yieldsTo(property, [arg1, arg2, …])
sinon stub实例
|
|
##sinon mock
- 用于给出expectation然后验证某个object的method是否是正确的
- 同spy的区别,mock出的object收到了数据或是调用并没有真正执行,一切针对mock的调用都是假的。所以mock可以用来测试具有side effect的函数,这里的side effect泛指和外部对象有数据交互或者是调用,比如调用外部对象的方法、向server发送数据、和UI对象有交互、写日志等等。
API
- 创建mock:var mock = sinon.mock(obj);
- 给出expectation mock.expects(“method”);
- 校验是否正确: mock.verify();
- 重置:mock.restore();
sinon mock 例子
|
|
sinon Fake XMLHttpRequest/ Fake Server
- fake server用法
|
|
- sinon可以用作实现request的模拟,现在更多的使用supertest
用于HTTP的测试
|
|