Mockery: how to use shouldReceive with method_exists?












7















In my application code, I've got a method_exists check to authorize some hooking in a create process:



// Note: $myClass is implementing a ListItemFactory interface.

if ($isCreate) {
$methodName = "create{$attr}ListItem";

if (method_exists($myClass, $methodName)) {
$item = $myClass->$methodName();
} else {
[...]
}
}


I'm trying to test this code, mocking $myClass and checking if $methodName is in fact called. Here's how I wrote the test:



/** @test */
function specific_create_method_is_called()
{
$factory = Mockery::mock(ListItemFactory::class)->makePartial();
$factory->shouldReceive("createCommentsListItem")->once();
[...]
}


But this isn't working, because method_exists is not defined in the mock. I'm fairly new to mock stuff, so maybe there's an obvious way to manage this problem, like "stubbing" the wanted function, but I wasn't able to find the way...



Thanks in advance for any help.










share|improve this question























  • The ListItemFactory source would be great to see.

    – l-x
    Nov 30 '15 at 14:38











  • was just solving very similar stuff, check out stackoverflow.com/questions/37927273/… this might help you

    – user3350906
    Jun 20 '16 at 17:41











  • This is what helped me: stackoverflow.com/a/46922330/470749

    – Ryan
    Feb 23 at 19:13
















7















In my application code, I've got a method_exists check to authorize some hooking in a create process:



// Note: $myClass is implementing a ListItemFactory interface.

if ($isCreate) {
$methodName = "create{$attr}ListItem";

if (method_exists($myClass, $methodName)) {
$item = $myClass->$methodName();
} else {
[...]
}
}


I'm trying to test this code, mocking $myClass and checking if $methodName is in fact called. Here's how I wrote the test:



/** @test */
function specific_create_method_is_called()
{
$factory = Mockery::mock(ListItemFactory::class)->makePartial();
$factory->shouldReceive("createCommentsListItem")->once();
[...]
}


But this isn't working, because method_exists is not defined in the mock. I'm fairly new to mock stuff, so maybe there's an obvious way to manage this problem, like "stubbing" the wanted function, but I wasn't able to find the way...



Thanks in advance for any help.










share|improve this question























  • The ListItemFactory source would be great to see.

    – l-x
    Nov 30 '15 at 14:38











  • was just solving very similar stuff, check out stackoverflow.com/questions/37927273/… this might help you

    – user3350906
    Jun 20 '16 at 17:41











  • This is what helped me: stackoverflow.com/a/46922330/470749

    – Ryan
    Feb 23 at 19:13














7












7








7








In my application code, I've got a method_exists check to authorize some hooking in a create process:



// Note: $myClass is implementing a ListItemFactory interface.

if ($isCreate) {
$methodName = "create{$attr}ListItem";

if (method_exists($myClass, $methodName)) {
$item = $myClass->$methodName();
} else {
[...]
}
}


I'm trying to test this code, mocking $myClass and checking if $methodName is in fact called. Here's how I wrote the test:



/** @test */
function specific_create_method_is_called()
{
$factory = Mockery::mock(ListItemFactory::class)->makePartial();
$factory->shouldReceive("createCommentsListItem")->once();
[...]
}


But this isn't working, because method_exists is not defined in the mock. I'm fairly new to mock stuff, so maybe there's an obvious way to manage this problem, like "stubbing" the wanted function, but I wasn't able to find the way...



Thanks in advance for any help.










share|improve this question














In my application code, I've got a method_exists check to authorize some hooking in a create process:



// Note: $myClass is implementing a ListItemFactory interface.

if ($isCreate) {
$methodName = "create{$attr}ListItem";

if (method_exists($myClass, $methodName)) {
$item = $myClass->$methodName();
} else {
[...]
}
}


I'm trying to test this code, mocking $myClass and checking if $methodName is in fact called. Here's how I wrote the test:



/** @test */
function specific_create_method_is_called()
{
$factory = Mockery::mock(ListItemFactory::class)->makePartial();
$factory->shouldReceive("createCommentsListItem")->once();
[...]
}


But this isn't working, because method_exists is not defined in the mock. I'm fairly new to mock stuff, so maybe there's an obvious way to manage this problem, like "stubbing" the wanted function, but I wasn't able to find the way...



Thanks in advance for any help.







php unit-testing testing mockery






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 22 '15 at 15:03









PhilippePhilippe

488516




488516













  • The ListItemFactory source would be great to see.

    – l-x
    Nov 30 '15 at 14:38











  • was just solving very similar stuff, check out stackoverflow.com/questions/37927273/… this might help you

    – user3350906
    Jun 20 '16 at 17:41











  • This is what helped me: stackoverflow.com/a/46922330/470749

    – Ryan
    Feb 23 at 19:13



















  • The ListItemFactory source would be great to see.

    – l-x
    Nov 30 '15 at 14:38











  • was just solving very similar stuff, check out stackoverflow.com/questions/37927273/… this might help you

    – user3350906
    Jun 20 '16 at 17:41











  • This is what helped me: stackoverflow.com/a/46922330/470749

    – Ryan
    Feb 23 at 19:13

















The ListItemFactory source would be great to see.

– l-x
Nov 30 '15 at 14:38





The ListItemFactory source would be great to see.

– l-x
Nov 30 '15 at 14:38













was just solving very similar stuff, check out stackoverflow.com/questions/37927273/… this might help you

– user3350906
Jun 20 '16 at 17:41





was just solving very similar stuff, check out stackoverflow.com/questions/37927273/… this might help you

– user3350906
Jun 20 '16 at 17:41













This is what helped me: stackoverflow.com/a/46922330/470749

– Ryan
Feb 23 at 19:13





This is what helped me: stackoverflow.com/a/46922330/470749

– Ryan
Feb 23 at 19:13












1 Answer
1






active

oldest

votes


















0














Create a small testing class and mock it partially.
Define in the scope of your test class:



class MyClass implements ListItemFactory {
public function createCommentsListItem() { }
}


Then, in your test function:



/** @test */
function specific_create_method_is_called()
{
$myClass = m::mock(MyClass::class)->makePartial();

$myClass->shouldReceive('createCommentsListItem')->once();

// method_exists($myClass, 'createCommentsListItem')
// returns true now
}


(in this example: use Mockery as m;)






share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f33856225%2fmockery-how-to-use-shouldreceive-with-method-exists%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    Create a small testing class and mock it partially.
    Define in the scope of your test class:



    class MyClass implements ListItemFactory {
    public function createCommentsListItem() { }
    }


    Then, in your test function:



    /** @test */
    function specific_create_method_is_called()
    {
    $myClass = m::mock(MyClass::class)->makePartial();

    $myClass->shouldReceive('createCommentsListItem')->once();

    // method_exists($myClass, 'createCommentsListItem')
    // returns true now
    }


    (in this example: use Mockery as m;)






    share|improve this answer




























      0














      Create a small testing class and mock it partially.
      Define in the scope of your test class:



      class MyClass implements ListItemFactory {
      public function createCommentsListItem() { }
      }


      Then, in your test function:



      /** @test */
      function specific_create_method_is_called()
      {
      $myClass = m::mock(MyClass::class)->makePartial();

      $myClass->shouldReceive('createCommentsListItem')->once();

      // method_exists($myClass, 'createCommentsListItem')
      // returns true now
      }


      (in this example: use Mockery as m;)






      share|improve this answer


























        0












        0








        0







        Create a small testing class and mock it partially.
        Define in the scope of your test class:



        class MyClass implements ListItemFactory {
        public function createCommentsListItem() { }
        }


        Then, in your test function:



        /** @test */
        function specific_create_method_is_called()
        {
        $myClass = m::mock(MyClass::class)->makePartial();

        $myClass->shouldReceive('createCommentsListItem')->once();

        // method_exists($myClass, 'createCommentsListItem')
        // returns true now
        }


        (in this example: use Mockery as m;)






        share|improve this answer













        Create a small testing class and mock it partially.
        Define in the scope of your test class:



        class MyClass implements ListItemFactory {
        public function createCommentsListItem() { }
        }


        Then, in your test function:



        /** @test */
        function specific_create_method_is_called()
        {
        $myClass = m::mock(MyClass::class)->makePartial();

        $myClass->shouldReceive('createCommentsListItem')->once();

        // method_exists($myClass, 'createCommentsListItem')
        // returns true now
        }


        (in this example: use Mockery as m;)







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 15 '18 at 19:29









        TomTom

        1,2051121




        1,2051121
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f33856225%2fmockery-how-to-use-shouldreceive-with-method-exists%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            List item for chat from Array inside array React Native

            Thiostrepton

            Caerphilly