2017-01-17 15 views
7

Tôi muốn thử một hàm với đùa, nhưng chỉ khi nó được gọi với đối số cụ thể, ví dụ:Tôi có thể giả lập các hàm với các đối số cụ thể bằng Jest không?

function sum(x, y) { 
    return x + y; 
} 

// mock sum(1, 1) to return 4 
sum(1, 1) // returns 4 (mocked) 
sum(1, 2) // returns 3 (not mocked) 

Có một tính năng tương tự được thực hiện trong thư viện RSpec của Ruby:

class Math 
    def self.sum(x, y) 
    return x + y 
    end 
end 

allow(Math).to receive(:sum).with(1, 1).and_return(4) 
Math.sum(1, 1) # returns 4 (mocked) 
Math.sum(1, 2) # returns 3 (not mocked) 

Những gì tôi đang cố gắng để đạt được trong các thử nghiệm của tôi là tách một tốt hơn, chúng ta hãy nói rằng tôi muốn thử nghiệm một chức năng dựa vào sum:

function sum2(x) { 
    return sum(x, 2); 
} 

// I don't want to depend on the sum implementation in my tests, 
// so I would like to mock sum(1, 2) to be "anything I want", 
// and so be able to test: 

expect(sum2(1)).toBe("anything I want"); 

// If this test passes, I've the guarantee that sum2(x) is returning 
// sum(x, 2), but I don't have to know what sum(x, 2) should return 

Tôi biết rằng có một cách để thực hiện điều này bằng cách làm một cái gì đó như:

sum = jest.fn(function (x, y) { 
    if (x === 1 && y === 2) { 
    return "anything I want"; 
    } else { 
    return sum(x, y); 
    } 
}); 

expect(sum2(1)).toBe("anything I want"); 

Nhưng nó sẽ được tốt đẹp nếu chúng ta có một số chức năng đường để đơn giản hóa nó.

Nghe có hợp lý không? Chúng ta đã có tính năng này trong Jest chưa?

Cảm ơn phản hồi của bạn.

Trả lời

4

Không có cách nào để thực hiện việc này trong Jest. Bạn có thể sử dụng sinons stubs cho việc này. từ tài liệu:

stub.withArgs (arg1 [, arg2, ...]);

Chỉ áp dụng phương thức cho các đối số được cung cấp . Điều này hữu ích để thể hiện rõ hơn trong các xác nhận của bạn, nơi bạn có thể truy cập gián điệp bằng cùng một cuộc gọi. Nó là cũng hữu ích để tạo ra một bài có thể hành động khác nhau để phản hồi lại các đối số khác nhau theo số .

"test should stub method differently based on arguments": function() { 
    var callback = sinon.stub(); 
    callback.withArgs(42).returns(1); 
    callback.withArgs(1).throws("TypeError"); 

    callback(); // No return value, no exception 
    callback(42); // Returns 1 
    callback(1); // Throws TypeError 
} 
1

này có thể giúp ...

Tôi có một cái gì đó tương tự nhờ đó tôi đã cùng một phương pháp gọi là với các thông số khác nhau đòi hỏi phải có kết quả trả về khác nhau từ stubbed/cuộc gọi chế giễu. Tôi đã sử dụng một biến với một danh sách các chức năng khi tôi đã thực hiện một cuộc gọi đến dịch vụ mocked i lấy chức năng ra khỏi đầu hàng đợi và thực hiện chức năng. Nó đòi hỏi kiến ​​thức về thứ tự thực thi mà bạn đang thử nghiệm và không thực sự xử lý các phản hồi khác nhau theo đối số nhưng đã cho phép tôi làm việc xung quanh sự hạn chế trong jest.

var mockedQueue = []; 
mockedQueue.push(() => {return 'A';}) 
mockedQueue.push(() => {return 'B';}) 

service.invoke = jest.fn(()=>{ 
    serviceFunctionToCall = mockedQueue.shift(); 
    return serviceFunctionToCall(); 
}) 
Các vấn đề liên quan