我有一个测试可以很好地使用原始指针,但是我无法让它与std::shared_ptr. 类是这样的:
class MyClass
{
    MyClass(SomeService *service);
    void DoIt();
}
我的测试代码是这样的:
    class MyClassTests : public ::testing::Test
    {
    public:
        MyClassTests():
            myClass_(new MyClass(&service_))
        {}
    protected:
        SomeServiceFake service_;
        MyClassSharedPointer myClass_;
    };
TEST_F(MyClassTests, DoIt_DoesNotMeetCriteria_DoesNotPerformAction) {
    // Arrange
    EXPECT_CALL(service_, MeetsCriteria(_))
        .WillRepeatedly(Return(false));
    EXPECT_CALL(service_, PerformAction(_))
        .Times(0);
    // Act
    myClass_->DoIt();
}
在这个测试中,service_是在测试中的堆栈上创建的模拟/伪造,我将地址传递给MyClass. 更改MyClass为servicea shared_ptr,我的新课程如下所示:
class MyClass
{
    MyClass(std::shared_ptr<SomeService> service);
    DoIt();
}
我在测试中尝试的是:
    class MyClassTests : public ::testing::Test
    {
    public:
        MyClassTests():
            myClass_(new MyClass(std::shared_ptr<SomeService>(&service_)))
        {
        }
            ...
但是,当我这样做时,测试失败并显示:
Debug Assertion Failed!
Expression: _CtrlIsValidHeapPointer(pUserData)
简而言之,我需要一个shared_ptrto service_(这是一个假对象)来传递给MyClass构造函数,并且我需要一个函数的非指针EXPECT_CALL。我怎样才能让它正常工作?
更新
尝试动态分配 SomeServiceFake 以获取 shared_ptr 然后使用 * 运算符 on service_,这让我“更进一步”,但现在我收到以下错误:
error : this mock object
(used in test MyClassTests.DoIt_DoesNotMeetCriteria_DoesNotPerformAction)
should be deleted but never is. Its address is @009BBA68.
1>EXEC : error : 1 leaked mock object found at program exit.
更新 2
使用Mock::AllowLeak(service_.get());所以我现在可以解决这个问题。希望我能得到答案。