Unit test multiple calls that “MustHaveHappenedOnceExactly”












1















I want to verify that the method I test calls a service multiple times with different arguments. The service method has a required and a optional argument:



public void Foo(object o1, object o2 = null);


I am expecting Foo to get called 2 times, once without and once with the optional parameter. The optional parameter should match a criteria. To test this I am using MustHaveHappenedOnceExactly from FakeItEasy:



A.CallTo(() => testee.Method(A<object>.That.IsNotNull(), A<object>.That.IsNull()))
.MustHaveHappenedOnceExactly().Then(
A.CallTo(() => testee.Method(A<object>.That.IsNotNull(), A<object>.That.Matches(p => p.Length == 2)))
.MustHaveHappenedOnceExactly());


What I do get is the following exception:




FakeItEasy.UserCallbackException: Argument matcher <p => (p.Length> == 2)> threw an exception. See inner exception for details. ---> System.NullReferenceException: Object reference not set to an instance of an object.




I assume that MustHaveHappenedOnceExactly checks all calls on Foo with the defined matches and thereby the second match throws an exception when Foo is called without Parameter. How can I avoid that exception and still test that Foo got called once with a specific argument?










share|improve this question





























    1















    I want to verify that the method I test calls a service multiple times with different arguments. The service method has a required and a optional argument:



    public void Foo(object o1, object o2 = null);


    I am expecting Foo to get called 2 times, once without and once with the optional parameter. The optional parameter should match a criteria. To test this I am using MustHaveHappenedOnceExactly from FakeItEasy:



    A.CallTo(() => testee.Method(A<object>.That.IsNotNull(), A<object>.That.IsNull()))
    .MustHaveHappenedOnceExactly().Then(
    A.CallTo(() => testee.Method(A<object>.That.IsNotNull(), A<object>.That.Matches(p => p.Length == 2)))
    .MustHaveHappenedOnceExactly());


    What I do get is the following exception:




    FakeItEasy.UserCallbackException: Argument matcher <p => (p.Length> == 2)> threw an exception. See inner exception for details. ---> System.NullReferenceException: Object reference not set to an instance of an object.




    I assume that MustHaveHappenedOnceExactly checks all calls on Foo with the defined matches and thereby the second match throws an exception when Foo is called without Parameter. How can I avoid that exception and still test that Foo got called once with a specific argument?










    share|improve this question



























      1












      1








      1


      0






      I want to verify that the method I test calls a service multiple times with different arguments. The service method has a required and a optional argument:



      public void Foo(object o1, object o2 = null);


      I am expecting Foo to get called 2 times, once without and once with the optional parameter. The optional parameter should match a criteria. To test this I am using MustHaveHappenedOnceExactly from FakeItEasy:



      A.CallTo(() => testee.Method(A<object>.That.IsNotNull(), A<object>.That.IsNull()))
      .MustHaveHappenedOnceExactly().Then(
      A.CallTo(() => testee.Method(A<object>.That.IsNotNull(), A<object>.That.Matches(p => p.Length == 2)))
      .MustHaveHappenedOnceExactly());


      What I do get is the following exception:




      FakeItEasy.UserCallbackException: Argument matcher <p => (p.Length> == 2)> threw an exception. See inner exception for details. ---> System.NullReferenceException: Object reference not set to an instance of an object.




      I assume that MustHaveHappenedOnceExactly checks all calls on Foo with the defined matches and thereby the second match throws an exception when Foo is called without Parameter. How can I avoid that exception and still test that Foo got called once with a specific argument?










      share|improve this question
















      I want to verify that the method I test calls a service multiple times with different arguments. The service method has a required and a optional argument:



      public void Foo(object o1, object o2 = null);


      I am expecting Foo to get called 2 times, once without and once with the optional parameter. The optional parameter should match a criteria. To test this I am using MustHaveHappenedOnceExactly from FakeItEasy:



      A.CallTo(() => testee.Method(A<object>.That.IsNotNull(), A<object>.That.IsNull()))
      .MustHaveHappenedOnceExactly().Then(
      A.CallTo(() => testee.Method(A<object>.That.IsNotNull(), A<object>.That.Matches(p => p.Length == 2)))
      .MustHaveHappenedOnceExactly());


      What I do get is the following exception:




      FakeItEasy.UserCallbackException: Argument matcher <p => (p.Length> == 2)> threw an exception. See inner exception for details. ---> System.NullReferenceException: Object reference not set to an instance of an object.




      I assume that MustHaveHappenedOnceExactly checks all calls on Foo with the defined matches and thereby the second match throws an exception when Foo is called without Parameter. How can I avoid that exception and still test that Foo got called once with a specific argument?







      c# unit-testing fakeiteasy






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Jan 2 at 12:08









      Thomas Levesque

      238k53499671




      238k53499671










      asked Jan 2 at 11:13









      user2900970user2900970

      5351316




      5351316
























          1 Answer
          1






          active

          oldest

          votes


















          1














          Refactor the matcher to cater for the null i.e. .Matches(p => p != null && p.Length == 2)



          A.CallTo(() => testee.Method(
          A<object>.That.IsNotNull(),
          A<object>.That.IsNull()
          )
          ).MustHaveHappenedOnceExactly()
          .Then(A.CallTo(() => testee.Method(
          A<object>.That.IsNotNull(),
          A<object>.That.Matches(p => p != null && p.Length == 2) //<--
          )
          ).MustHaveHappenedOnceExactly()
          );





          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%2f54005302%2funit-test-multiple-calls-that-musthavehappenedonceexactly%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









            1














            Refactor the matcher to cater for the null i.e. .Matches(p => p != null && p.Length == 2)



            A.CallTo(() => testee.Method(
            A<object>.That.IsNotNull(),
            A<object>.That.IsNull()
            )
            ).MustHaveHappenedOnceExactly()
            .Then(A.CallTo(() => testee.Method(
            A<object>.That.IsNotNull(),
            A<object>.That.Matches(p => p != null && p.Length == 2) //<--
            )
            ).MustHaveHappenedOnceExactly()
            );





            share|improve this answer




























              1














              Refactor the matcher to cater for the null i.e. .Matches(p => p != null && p.Length == 2)



              A.CallTo(() => testee.Method(
              A<object>.That.IsNotNull(),
              A<object>.That.IsNull()
              )
              ).MustHaveHappenedOnceExactly()
              .Then(A.CallTo(() => testee.Method(
              A<object>.That.IsNotNull(),
              A<object>.That.Matches(p => p != null && p.Length == 2) //<--
              )
              ).MustHaveHappenedOnceExactly()
              );





              share|improve this answer


























                1












                1








                1







                Refactor the matcher to cater for the null i.e. .Matches(p => p != null && p.Length == 2)



                A.CallTo(() => testee.Method(
                A<object>.That.IsNotNull(),
                A<object>.That.IsNull()
                )
                ).MustHaveHappenedOnceExactly()
                .Then(A.CallTo(() => testee.Method(
                A<object>.That.IsNotNull(),
                A<object>.That.Matches(p => p != null && p.Length == 2) //<--
                )
                ).MustHaveHappenedOnceExactly()
                );





                share|improve this answer













                Refactor the matcher to cater for the null i.e. .Matches(p => p != null && p.Length == 2)



                A.CallTo(() => testee.Method(
                A<object>.That.IsNotNull(),
                A<object>.That.IsNull()
                )
                ).MustHaveHappenedOnceExactly()
                .Then(A.CallTo(() => testee.Method(
                A<object>.That.IsNotNull(),
                A<object>.That.Matches(p => p != null && p.Length == 2) //<--
                )
                ).MustHaveHappenedOnceExactly()
                );






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Jan 2 at 11:51









                NkosiNkosi

                119k17137201




                119k17137201
































                    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%2f54005302%2funit-test-multiple-calls-that-musthavehappenedonceexactly%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

                    The term 'EXEC' is not recognized as the name of a cmdlet Powershell

                    NPM command prompt closes immediately [closed]

                    Error binding properties and functions in emscripten