使用Sinon

时间:2016-04-17 15:12:26

标签: javascript mocha sinon stubbing

我正在尝试测试一些客户端代码,为此我需要使用Mocha / Sinon来存储window.location.href属性的值。

到目前为止我尝试了什么(using this example):

describe('Logger', () => {
    it('should compose a Log', () => {
        var stub = sinon.stub(window.location, 'href', 'http://www.foo.com');
    });
});

跑步者显示以下错误:

  

TypeError:自定义存根应该是函数或属性描述符

将测试代码更改为:

describe('Logger', () => {
    it('should compose a Log', () => {
        var stub = sinon.stub(window.location, 'href', {
            value: 'foo'
        });
    });
});

产生此错误:

  

TypeError:尝试将字符串属性href包装为函数

将函数作为第三个参数传递给sinon.stub也不起作用。

有没有办法提供假window.location.href字符串,也避免重定向(因为我在浏览器中测试)?

3 个答案:

答案 0 :(得分:16)

您需要使用globalwindowbeforeEach

中模拟测试的it对象

e.g。

it('should compose a Log', () => {
   global.window = {
       location: {
           href: {
               value: 'foo'
           }
       }
   }
  //.... call the funciton 
});

答案 1 :(得分:12)

使用window.location.assign(url)而不是覆盖window.location的值。然后,您可以在assign对象上存根window.location方法。

http://www.w3schools.com/jsref/met_loc_assign.asp

更新:我在无头浏览器中对此进行了测试,但如果您在Chrome中运行测试,它可能无效。请参阅@try-catch-finally's response

答案 2 :(得分:7)

Stubs不能替换属性,只能替换函数。

抛出的错误强化了这一点:

  

TypeError:自定义存根应该是函数或属性描述符

来自文档:

  

何时使用存根?

     

根据需要使用存根:

     
      
  1. 从测试中控制方法的行为,以强制代码沿特定路径下移。示例包括强制方法抛出错误以测试错误处理。

  2.   
  3. 当您想要阻止直接调用特定方法时(可能是因为它触发了不需要的行为,例如XMLHttpRequest或类似行为)。

  4.   

http://sinonjs.org/releases/v2.0.0/stubs/

可能的解决方案

虽然可以替换许多内置对象(用于测试),但有些内容可能无法实现。对于这些属性,您可以创建外观对象,然后必须在代码中使用它们,并且能够在测试中替换它们。

例如:

var loc = {

    setLocationHref: function(newHref) {
        window.location.href = newHref;
    },

    getLocationHref: function() {
        return window.location.href;
    }

};

用法:

loc.setLocationHref('http://acme.com');

然后你可以在你的测试中写

var stub = sinon.stub(loc, 'setLocationHref').returns('http://www.foo.com');

请注意链式returns()电话。您的代码中还有另一个错误:第三个参数必须是函数,而不是另一个类型的值。它是一个回调,而不是该属性应返回的内容。

See the source code of stub()

相关问题