Jasmine的spyOn()是否允许执行间谍功能?

时间:2014-11-13 15:33:08

标签: unit-testing jasmine

Jasmine的spyOn()方法是否允许执行spied on函数,或者在调用spied方法(即将获取)时拦截调用,并返回true

PS:有人能指出spyOn()内部运作的解释吗?

2 个答案:

答案 0 :(得分:1)

它只是创建一个模拟(间谍)对象并将其注入您测试的代码。

它有三个主要目的:

  1. 如果代码调用spy来测试代码: toHaveBeenCalled
  2. 如果使用适当的参数调用代码,请对其进行测试: toHaveBeenCalledWith
  3. 从间谍测试代码中获取不同的返回值: and.callThrough

答案 1 :(得分:1)

间谍:

间谍可以假装是在编写单元测试代码时可以使用的函数或对象,以检查函数/对象的行为

var Person = function() {};
Dictionary.prototype.FirstName = function() {
return "My FirstName";
};
Dictionary.prototype.LastName = function() {
return "My LastName";
};
Person.prototype.MyName = function() {
return FirstName() + " " + LastName();
};

Person.prototype.MyLocation = function() {
Return ”some location”;
};

describe("Person", function() {
    it('uses First Name and Last Name for MyName', function() {
        var person = new Person;
        spyOn(person , "FirstName"); 
        spyOn(person, "LastName"); 
        person.MyName();
        expect(person.FirstName).toHaveBeenCalled(); 
        expect(person.LastName).toHaveBeenCalled(); 
    });
});

通过SpyOn,你可以知道某个功能是否已被调用

expect(person. MyLocation).not.toHaveBeenCalled();

您可以确保间谍始终返回给定值并对其进行测试

spyOn(person, " MyName ").andReturn("My FirstNameMy LasttName ");
var result = person.MyName();
expect(result).toEqual("My FirstName  My LasttName ");

间谍可以通过假功能调用

it("can call a fake function", function() {
var fakeFun = function() {
alert("I am a spy!”);
return "hello";
};
var person = new person();
spyOn(person, "MyName").andCallFake(fakeFun);
person. MyName (); // alert
})

您甚至可以创建新的间谍功能或对象并使用它

it("can have a spy function", function() {
var person = new Person();
person.StreetAddress = jasmine.createSpy("Some Address");
person. StreetAddress ();
expect(person. StreetAddress).toHaveBeenCalled();
});