2013-06-21 39 views
7

Tôi có một lớp học mà phải mất một boolean như một tham số tài liệu tham khảo và trả về một số nguyên:Google mock ByRef phương pháp

class Foo 
{ 
    public: 
    Bar my_bar; 
    virtual int myMethod(bool &my_boolean) = 0; 
} 

/*...*/ 

int Foo::myMethod(bool &my_boolean){ 
    if (my_bar == NULL){ 
    my_boolean = false; 
    return -1; 
    } 
    else{ 
    my_boolean = true; 
    return 0; 
    } 

} 

Và tôi đã tạo ra một mô hình cho lớp này:

class MockFoo : public Foo 
{ 
    MOCK_METHOD1(myMethod,int(bool &my_boolean)); 
} 

Tôi có vấn đề về cách đặt kỳ vọng cho loại hàm này, vì tôi cần đặt giá trị trả về tham số tham chiếu cho giá trị cụ thể để tạo thử nghiệm đơn vị đúng cách. Làm cách nào để xử lý loại hàm này với gmock? Tôi đã thử theo những gì tôi đã nghĩ làm giải pháp trên tài liệu:

using ::testing::SetArgPointee; 

class MockMutator : public Mutator { 
    public: 
    MOCK_METHOD2(Mutate, void(bool mutate, int* value)); 
    ... 
}; 
    ... 

MockMutator mutator; 
EXPECT_CALL(mutator, Mutate(true, _)) 
    .WillOnce(SetArgPointee<1>(5)); 

Nhưng tôi không hiểu ví dụ hoặc không áp dụng cho trường hợp này. Có ai đã giải quyết tình huống này trước đây không?

Xin cảm ơn trước.

+0

Sau đó, tôi không nhận được câu hỏi của bạn là gì. Bạn có thể giải quyết vấn đề của mình không? Mã này có vẻ đúng cho tôi. Hoặc bạn có muốn biết cách đặt kỳ vọng cho thông số tham chiếu tương tự không? 'ByRef()' sẽ hoàn toàn OK cho điều này. –

+0

+1 khó có thể lấy từ ví dụ về sách nấu ăn. –

Trả lời

6

Câu hỏi của bạn khó có được! Các mẫu từ sách nấu ăn của Google mocks cũng rất tốt.

Bạn có muốn sử dụng lại việc triển khai cho Foo::myMethod() với lớp mô phỏng hay bạn chỉ muốn giả lập các hiệu ứng phụ (giá trị trả về và thay đổi theo tham số ref) cho các tình huống cuộc gọi cụ thể?

Lớp mô hình thường có nghĩa là thay thế/mô phỏng lớp học Foo của bạn, không được kế thừa trực tiếp hoặc hành vi của lớp đó. Không biết nếu cách bạn xác định hành vi 'mặc định' này cho một phương thức thuần túy sẽ hoạt động, nhưng nghi ngờ điều đó. Bạn có thể chỉ cần bỏ qua các = 0 sau đó. Cách tiếp cận tốt hơn sẽ được tách ra một tuyên bố giao diện thực như:

struct IFoo 
{ 
    virtual int myMethod(bool &my_boolean) = 0; 
    virtual ~IFoo() {} 
}; 

class Foo : public IFoo 
{ 
    // ... 
}; 

class MockFoo : public IFoo 
{ 
    MOCK_METHOD1(myMethod,int(bool &my_boolean)); 
}; 

Nếu bạn có trường hợp sau, bạn sẽ nhận ra với testing::Return(value)testing::SetArgReferee<N>(value) (phát hiện ra rằng trong rất hữu ích 'Cheat Sheet').

gọi sự mong đợi của bạn sẽ trông như thế này thì:

MockFoo foo; 

// Expect call to myMethod() return -1 and set the by ref argument to true 
EXPECT_CALL(foo, myMethod(_)) 
    .WillOnce(DoAll(SetArgReferee<0>(true),Return(-1))); 

// Expect call to myMethod() return 0 and set the by ref argument to false 
EXPECT_CALL(foo, myMethod(_)) 
    .WillOnce(DoAll(SetArgReferee<0>(false),Return(0))); 

Nếu bạn thực sự muốn sử dụng lại các lớp học lý ban đầu của bạn cho myMethod() có một cái nhìn tại 'Delegating calls to a parent class', resp. 'Delegating Calls to a Real Object'

+0

Xin lỗi @ g-makulik Tôi đã sao chép sai đoạn mã, câu hỏi đó không liên quan đến câu hỏi này. Tôi đã sửa lại ngay bây giờ. –

+0

Xin lỗi, tôi mất một chút thời gian để tìm ra vấn đề của bạn. 'ByRef()' là đường dẫn sai cho trường hợp này. –

+0

@RodrigoVasconcelos Không còn quan tâm? Điều này có giải quyết được vấn đề của bạn không? –

Các vấn đề liên quan