2017-11-23 14 views
0

함수의 로컬 객체에 EXPECT_CALL을 사용할 수 있습니까? 예를 들어함수의 로컬 객체에 EXPECT_CALL을 사용 하시겠습니까?

:

template<class T> 
std::string doSomethingWithTheCar() 
{ 
    T car; 
    return "the color of the car is: " + car.color(); 
} 

class Car 
{ 
public: 
    std::string color() 
    { 
     return "green"; 
    } 
}; 

class MockCar 
{ 
public: 
    MOCK_METHOD0(color, std::string()); 
}; 

TEST(MockLocalObject, doSomethingWithCarTest) { 
    EXPECT_CALL(car, color()) 
     .WillOnce(Return("red")); 

    std::string color = doSomethingWithTheCar<MockCar>(); 
    EXPECT_EQ(color, "red"); 
} 

실제 자동차 객체를 사용하거나 MockCar 될 경우 템플릿에 내가 제어 할 수 있습니다 인해. 하지만 여기에 EXPECT_CALL을 사용하는 방법이 있습니까?

+1

을 - 아니. 그러나 당신의 질문은 정확하지 않습니다, 나는 당신의 문제에 대한 쉬운 해결책이 있다고 확신합니다. 모의 클래스 메소드에 대한 호출을 기대할 수 있습니다.'testing :: MockFunction ;'을 호출 할 수 있습니다. 정확히 무엇을 달성하기를 원하십니까? 설명하려고하십시오. https://stackoverflow.com/help/mcve를 제공하십시오. – Ptaq666

+0

@ Ptaq666 : 답변 해 주셔서 감사합니다. 나는 MockFunction을 모른다. 그러나 나는 그것을 조사 할 것이다. 나는 수업과 시험을 추가했다. 나는 그것을 원한다. 모든 GMocks 기능에 대한 전체 개요가 있습니까? 아직 API 문서를 찾지 못했습니다. – Ctwx

+1

예, 여기 : https://github.com/google/googletest/tree/master/googlemock/docs – Ptaq666

답변

2

나는 이런 식으로 할 것 : 일반적으로

class AbstractCar { 
public: 
    virtual ~AbstractCar() = default; 
    virtual std::string color() = 0; 
}; 

class Car: public AbstractCar { 
public: 
    ~Car() override = default; 
    std::string color() override { 
     return "green"; 
    } 
}; 

class MockCar: public AbstractCar { 
public: 
    MOCK_METHOD0(color, std::string()); 
}; 

std::string doSomethingWithTheCar(AbstractCar* car) // or even better - use std::shared_ptr 
{ 
    return "the color of the car is: " + car->color(); 
} 

TEST(MockLocalObject, doSomethingWithCarTest) { 
    auto car = new MockCar; 
    EXPECT_CALL(*car, color()).WillOnce(Return("red")); 

    std::string color = doSomethingWithTheCar(car); 
    // this test will fail, because actual string is: 
    // "the color of the car is: red" 
    EXPECT_EQ(color, "red"); 
    delete car; 
} 
+0

예, 이미 사용하고 있습니다. 그러나 원래 함수에는 매개 변수가 없습니다. 그것이 내가 피하려고하는 것입니다. – Ctwx

+1

매개 변수를 수락하는 기능을 변경할 수없는 이유는 무엇입니까? 'doSomethingWithTheCar (const T & car) '나'doSomethingWithTheCar (CarFactory * factory)'와 같은) 의존성 주입이 없다면, 고려 된 함수 (또는 함수 리턴) 내에서'car'의 행동을 조롱하는 것은 불가능할 것입니다 어떤 식 으로든 가치). – Ptaq666

+0

나는 내가 모를 수도있는 방법이 있는지 알고 싶었다. C++은 너무 큽니다. 그래서 나는 때때로 놀랍니다. 고마워. 나는 내 코드 구조를 다시 생각할 것이다. 아마도 나는 여기 저기 조금 바뀔 수있다. – Ctwx