new*_*bie 2 javascript jquery jasmine jasmine-jquery
我是javascript测试新手。我正在使用茉莉花,需要测试是否已将正确的参数传递给方法。
这是我的方法:
function myView(){
if($('.view').is('.list')){
myWindow('list');
}else{
myWindow('random');
}
$('.view').toggleClass('my-list');
}
function myWindow(list) {
var url = /test.json;
$.post(url, {"list": list});
}
Here are my tests:
describe('#myView', function() {
beforeEach(function() {
fixture.load('myview.html');
});
it('sets window to list', function(){
expect(window.myWindow).toHaveBeenCalledWith('list');
});
});
Run Code Online (Sandbox Code Playgroud)
我收到以下错误。
Error: Expected a spy, but got Function.
Run Code Online (Sandbox Code Playgroud)
如果我在期望值之前添加此行(这似乎是错误的,因为我指定了应通过测试识别的正确参数)
spyOn(window, myWindow('list'));
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
undefined() method does not exist
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我写上述测试的好方法吗?
spyOn的第二个参数是您需要监视的属性的名称。当你打电话spyOn(window, myWindow('list'));,你的第二个参数是返回值的myWindow('list')是undefined=>抛出错误:undefined() method does not exist
在您的代码中,只需执行以下操作即可:
describe('#myView', function() {
beforeEach(function() {
fixture.load('myview.html');
});
it('sets window to list', function(){
spyOn(window, "myWindow");//spy the function
myView();//call your method that in turn should call your spy
expect(window.myWindow).toHaveBeenCalledWith('list');//verify
});
});
Run Code Online (Sandbox Code Playgroud)
在软件单元测试中,存在称为存根和模拟对象的概念。这些是被测方法的依赖性。spyOn是创建您的假对象以测试您的方法。
您正在直接访问全局window对象,这在单元测试中确实是一个问题。尽管 Javascript是一种动态类型的语言,但我们仍然能够模拟您的对象(某些静态类型的语言(如c#)是不可能的)。但是,要创建良好的可单元测试的代码,建议您重新设计代码以从外部注入代码。window
function myView(awindow){ //any dependency should be injected, this is an example to inject it via parameter
if($('.view').is('.list')){
awindow.myWindow('list');
}else{
awindow.myWindow('random');
}
$('.view').toggleClass('my-list');
}
Run Code Online (Sandbox Code Playgroud)
尝试这个:
describe('#myView', function() {
beforeEach(function() {
fixture.load('myview.html');
});
it('sets window to list', function(){
var spy = {myWindow:function(list){}};
spyOn(spy, "myWindow"); //create a spy
myView(spy); //call your method that in turn should call your spy
expect(spy.myWindow).toHaveBeenCalledWith('list'); //verify
});
});
Run Code Online (Sandbox Code Playgroud)
还有一件事,像这样的jQuery代码并不是单元测试的理想选择,因为它涉及代码中的DOM操作。如果有时间,您应该看一下angularjs框架,该框架将View(DOM)与模型(逻辑)分开,并使用依赖注入使代码可测试。
| 归档时间: |
|
| 查看次数: |
8183 次 |
| 最近记录: |