rollbear / trompeloeil

Header only C++14 mocking framework
Boost Software License 1.0
802 stars 85 forks source link

Expect call returning a reference #323

Closed RusYus closed 10 months ago

RusYus commented 10 months ago

I have an interface with a method that returns a reference to itself

struct IDmChecker
{
    virtual IDmChecker& setValuesForInstance(const std::string& a_instanceId) = 0;
};

and mock struct

struct DmCheckerMock : IDmChecker
{
    MAKE_MOCK1(setValuesForInstance, IDmChecker& (const std::string& a_instanceId), override);
};

I have a compilation error when using REQUIRE_CALL:

BOOST_AUTO_TEST_CASE(ShouldNotChangeOnSameValue)
{
...
    DmCheckerMock checker;
    REQUIRE_CALL(checker, setValuesForInstance(_)).RETURN(std::ref(checker));
...
}
1>C:\Dev\sipphone\test\SipPhoneTests\main\CSipSoftPhone_ManagerTestsFixture.cpp(186,5): error C2662: 'Tests::Main::DmCheckerMock &Tests::Main::DmCheckerMock::trompeloeil_self_setValuesForInstance(const std::string &)': cannot convert 'this' pointer from 'const Tests::Main::DmCheckerMock' to 'Tests::Main::DmCheckerMock &'
1>C:\Dev\sipphone\test\SipPhoneTests\main\CSipSoftPhone_ManagerTestsFixture.cpp(186,5): message : Conversion loses qualifiers
1>C:\Dev\sipphone\test\SipPhoneTests\main\DmCheckerMock.h(14,5): message : see declaration of 'Tests::Main::DmCheckerMock::trompeloeil_self_setValuesForInstance'
1>C:\Dev\sipphone\test\SipPhoneTests\main\CSipSoftPhone_ManagerTestsFixture.cpp(186,5): error C2955: 'trompeloeil::call_validator_t': use of class template requires template argument list
1>C:\Dev\external\tools\_FOSS\trompeloeil\include\trompeloeil.hpp(4213): message : see declaration of 'trompeloeil::call_validator_t'
1>C:\Dev\sipphone\test\SipPhoneTests\main\CSipSoftPhone_ManagerTestsFixture.cpp(186,5): error C2662: 'IDmChecker &Tests::Main::DmCheckerMock::setValuesForInstance(const std::string &)': cannot convert 'this' pointer from 'const Tests::Main::DmCheckerMock' to 'Tests::Main::DmCheckerMock &'
1>C:\Dev\sipphone\test\SipPhoneTests\main\CSipSoftPhone_ManagerTestsFixture.cpp(186,5): message : Conversion loses qualifiers
1>C:\Dev\sipphone\test\SipPhoneTests\main\DmCheckerMock.h(14,5): message : see declaration of 'Tests::Main::DmCheckerMock::setValuesForInstance'
1>C:\Dev\sipphone\test\SipPhoneTests\main\CSipSoftPhone_ManagerTestsFixture.cpp(186,5): error C2662: 'Tests::Main::DmCheckerMock::trompeloeil_l_tag_type_trompeloeil_14 Tests::Main::DmCheckerMock::trompeloeil_tag_setValuesForInstance(const std::string &)': cannot convert 'this' pointer from 'const Tests::Main::DmCheckerMock' to 'Tests::Main::DmCheckerMock &'
1>C:\Dev\sipphone\test\SipPhoneTests\main\CSipSoftPhone_ManagerTestsFixture.cpp(186,5): message : Conversion loses qualifiers
1>C:\Dev\sipphone\test\SipPhoneTests\main\DmCheckerMock.h(14,5): message : see declaration of 'Tests::Main::DmCheckerMock::trompeloeil_tag_setValuesForInstance'
1>C:\Dev\sipphone\test\SipPhoneTests\main\CSipSoftPhone_ManagerTestsFixture.cpp(186): error C2062: type 'unknown-type' unexpected
rollbear commented 10 months ago

Since you use RETURN, the variable checker is captured by value which is const in the body of the RETURN expression. You probably want to use LR_RETURN here, to ensure that you return a reference to the instance and not a copy of it.

See: https://godbolt.org/z/cWvfrMeYv

RusYus commented 10 months ago

Thanks, it works now!