如何在Jasmine中运行js函数?

时间:2015-03-05 03:46:24

标签: javascript jasmine

我能够在js文件上运行jasmine测试,但似乎我不能在测试框架内运行任何函数。

这是JS文件jasmine_test.js

$(document).ready(function() {
    function hello(){
        console.log("yo")
    }

    hello()

});

这里是form_detail_spec.js

describe("tthe things", function(){
    it("testing the things", function(){
        var array = ["one"];
        //isOptionalEmailForm(array);
        //expect(isOptionalEmailForm(array)).toBe(true);
        hello()
        expect(1).toBe(1);

    }); 
});

当我运行spec文件时,我在jasmine控制台中收到以下错误:

ReferenceError: hello is not defined

规范没有通过。如果我从测试中删除hello(),它可以很好地工作。

这是specrunner.html文件

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Jasmine Spec Runner v2.2.0</title>

  <link rel="shortcut icon" type="image/png" href="lib/jasmine-2.2.0/jasmine_favicon.png">
  <link rel="stylesheet" href="lib/jasmine-2.2.0/jasmine.css">

  <script type="text/javascript" src="../js/vendor/jquery/jquery-1.11.2.js"></script>
  <script src="lib/jasmine-2.2.0/jasmine.js"></script>
  <script src="lib/jasmine-2.2.0/jasmine-html.js"></script>
  <script src="lib/jasmine-2.2.0/boot.js"></script>
  <script type="text/javascript" src="../js/vendor/bootstrap/bootstrap.min.js"></script>
  <script type="text/javascript" src="../js/vendor/bootstrap/bootstrapValidator.min.js"></script>
  <script type="text/javascript" src="../js/validator_parameters.js"></script>

  <!-- include source files here... -->
  <!-- <script src="src/Player.js"></script> -->
  <!--  <script src="src/Song.js"></script> -->
  <script src="../js/jasmine_test.js"></script>

  <!-- include spec files here... -->
  <!--    <script src="spec/SpecHelper.js"></script> -->
  <!-- <script src="spec/PlayerSpec.js"></script> -->
  <script src="spec/form_details_spec.js"></script> 

</head>

<body>
</body>
</html> 

1 个答案:

答案 0 :(得分:2)

函数hello位于另一个函数内部。它不会暴露在外面,所以你无法直接测试它。将您的函数编写为模块(如CommonJS,AMD或新的ES6 modules,然后测试这些模块,真的很不错。

这是您使用CommonJS / NodeJS

编写和访问模块的方法
// hello.js
module.exports = hello; // export your function as a module
function hello() {
  // code here
}

// test.js
var hello = require('./path/to/hello'); // you don't need to write the .js extension
// you can now call `hello()` in your test code here.

不太理想,更传统的方式是通过不可避免的全局范围内的某些内容来访问hello函数。想想jQuery,你可以从jQuery$全局变量访问它的函数。

// your-file.js
var myLib = {
  hello: function() {
     // code
  }
}

然后加入your-file.js,以便myLib变量全局可用。然后,您可以使用hello从那里访问myLib.hello()。或者你可以让hello成为一个全局变量/函数,但这真的很糟糕。

模块现在是最好的做法。由于NodeJ基于CommonJS模块,我使用Browserify将CommonJS模块带到客户端,并使用tape测试所有内容,这也是一个CommonJS模块。