下面是我的代码
var s=function(){
return 'API CALL';//Through some API call i am getting and integer value
};
switch(s()){
case 0: store.p1="Some Text"; break;
case 1: store.p1="Some Other Text"; break;
case 2: store.p1="Another Text"; break;
}
在上面的函数中,我正在触发API调用,它返回一个整数值(0,1,2)并将其存储在's'中,我想用jasmine编写单元测试...,有谁可以帮助如何写测试用例?!
注意:'store'是全局变量,p1是'store'中的另一个变量,我想存储's'的值。
答案 0 :(得分:0)
为什么不将switch statement
function
作为parameter
,并根据参数返回消息。这样单元测试将更容易,因为您可以对功能进行单元测试。
function getValueStoredMessage(integer) {
return 'value ' + integer + ' stored';
}
你可以这样称呼它:
store.p1 = getValueStoredMessage(valueFromApi);
我个人没有编写过很多单元测试,但我认为函数比开关更容易?
答案 1 :(得分:0)
要正确测试您的API函数,您需要将其模拟出来并伪造返回值。有很多方法可以做到这一点,其中一些方法取决于你的API如何工作(角度http,服务,承诺等)。
看看茉莉花的间谍。如果它适用于您的情况,它们可能是最简单的。有点像:
spyOn(APIObject, "APIMethod").and.returnValue(1);
expect(store.p1).toBe(value 1 stored);
如果您没有模拟对象进行间谍活动,则可以使用createSpy
创建一个模拟对象,它将以相同的方式工作。
答案 2 :(得分:0)
使用map的大多数情况(就像你的情况一样)比使用switch更好。
function convert(str) {
//...
}
var s = '字符串'
convert(s); // => \u5B57\u7B26\u4E32
如果你想测试它,你必须模拟syncApiCallReturnsInteger()。为了做到这一点,它必须是可注射的。商店也必须是可注射的,所以你可以检查它的变化。
function f(){
var myInteger = syncApiCallReturnsInteger();
var map = {
0: "Some Text",
1: "Some Other Text",
2: "Another Text"
};
store.p1 = map[myInteger];
}
测试:
function f(syncApiCallReturnsInteger, store){
var myInteger = syncApiCallReturnsInteger();
var map = {
0: "Some Text",
1: "Some Other Text",
2: "Another Text"
};
store.p1 = map[myInteger];
}
如果你没有正确地注入依赖项,那么你唯一能做的就是使用和覆盖全局变量,这通常是一个坏主意,因为当你的项目增长时会有变量名冲突。
答案 3 :(得分:0)
简单来说,您不测试交换机。
一个开关,就像if,else,where,when和其他类似的东西是语言构造一样,所以不需要测试。测试处理流控制的部分代码,为流的每个结果编写不同的测试。
这意味着每个选项都有一个单独的套件。
function rockPaperScisors(){
...
// switch statement for the return value
}
describe('rock paper scissors caller', function(){
beforeEach(function(){
var throw;
});
it("should return rock when 1 is entered", function(){
throw = 1;
expect(throw).toEqual('rock');
});
it("should return paper when 2 is entered", function(){
throw = 2;
expect(throw).toEqual('paper');
});
it("should return scissor when 3 is entered", function(){
throw = 3;
expect(throw).toEqual('scisor');
});
});
describe('rock paper scissors caller', function(){
beforeEach(function(){
var throw;
});
it("should return rock when 1 is entered", function(){
throw = 1;
expect(throw).toEqual('rock');
});
it("should return paper when 2 is entered", function(){
throw = 2;
expect(throw).toEqual('paper');
});
it("should return scissor when 3 is entered", function(){
throw = 3;
expect(throw).toEqual('scisor');
});
});