下面是我的代码
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'的值。
为什么不将这个
switch statement
制作为 function
,它接受 parameter
并根据参数返回消息。这样单元测试会更容易,因为您可以对函数进行单元测试。
function getValueStoredMessage(integer) {
return 'value ' + integer + ' stored';
}
你可以这样称呼它:
store.p1 = getValueStoredMessage(valueFromApi);
我个人没有写过很多单元测试,但我想函数会比 switch 更容易?
为了正确测试你的 API 函数,你需要模拟它并让它伪造返回值。有很多方法可以做到这一点,其中一些方法取决于您的 API 的工作方式(角度 http、服务、promise 等)。
看看茉莉花间谍。如果适合您的情况,它们可能是最简单的。类似于:
spyOn(APIObject, "APIMethod").and.returnValue(1);
expect(store.p1).toBe(value 1 stored);
如果您没有要监视的模拟对象,您可以使用
createSpy
创建一个模拟对象,它会以相同的方式工作。
大多数情况下(就像你的情况一样)使用地图是比使用 switch 更好的选择。
function f(){
var myInteger = syncApiCallReturnsInteger();
var map = {
0: "Some Text",
1: "Some Other Text",
2: "Another Text"
};
store.p1 = map[myInteger];
}
如果你想测试这个,你必须模拟syncApiCallReturnsInteger()。为了做到这一点,它必须是可注射的。商店也必须是可注入的,这样你就可以检查它的变化。
function f(syncApiCallReturnsInteger, store){
var myInteger = syncApiCallReturnsInteger();
var map = {
0: "Some Text",
1: "Some Other Text",
2: "Another Text"
};
store.p1 = map[myInteger];
}
测试:
describe("blah", function() {
it("f sets store.p1", function() {
var fixture2expectation = {
0: "Some Text",
1: "Some Other Text",
2: "Another Text"
};
for (var fixtureString in fixture2expectation){
var fixture = parseInt(fixtureString);
var expectation = fixture2expectation[fixture];
var mockApiCall = function (){return fixture;};
var mockStore = {};
f(mockApiCall, mockStore);
expect(mockStore.p1).toBe(expectation);
}
});
});
如果您没有正确注入依赖项,那么您唯一能做的就是使用和覆盖全局变量,这通常是一个坏主意,因为当您的项目增长时,稍后会出现变量名称冲突。
简单来说,您不需要测试开关。
开关,就像 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');
});
});