Giter Site home page Giter Site logo

Comments (5)

eranpeer avatar eranpeer commented on June 15, 2024

The last few days I was trying to think about direct support for out parameters but I could not come up with an elegant idea. Meantime you can specify the value of an out pram by stubbing the method with a lambda replacement. For example:

        struct ApiInterface {
            virtual bool apiMethod(int a, int b, int& result) = 0;
        };

        Mock<ApiInterface> mock;
        When(Method(mock, apiMethod)).AlwaysDo([](int a, int b, int& result) {
            result = a + b;
            return true;
        });

        int result;
        ASSERT_TRUE(mock.get().apiMethod(1,2,result));
        ASSERT_EQUAL(3,result);

I will continue thinking about it, maybe something similar to argument matchers will do the work.
Any suggestion?

from fakeit.

binshuohu avatar binshuohu commented on June 15, 2024

First, I have to say I'm not very familiar with Gmock. When I look at its support for output arguments, I wouldn't say the test code looks very readable, despite its flexibility. I hope your solution wouldn't compromise test code clarity, which is one of the biggest features of this project, right?
I guess using lambdas to do the dirty work would suffice for now.

from fakeit.

eranpeer avatar eranpeer commented on June 15, 2024

I agree, gmock is a good example for what we DON'T want to do.
Here is a gmock example without out parameters:

EXPECT_CALL(testobject, testfunction(,, _))
.WillOnce(testing::SetArgReferee<0>(value1))
.WillOnce(testing::SetArgReferee<1>(value2))
.WillOnce(Return(true));

The current fakeit alternative is:

When(Method(testobject, testfunction)).Do([](auto& arg1, auto& arg2, auto
arg3)
{
arg1 = value1;
arg2 = value2;
return true;
});

As you said, my biggest effort is trying to create a simple & expressive
syntax.
How about?:

When(Method(testobject, testfunction).Using(SetValue(value1),
SetValue(value2), _)).Return(true);

It is a little confusing though it is very short.

What we have here is an "ArgumentAssigner" instead of an "ArgumentMatcher"
for the first 2 parameters. The third parameter is an "in" parameter and we
use a simple matcher for it.

???

On Fri, May 8, 2015 at 8:01 AM, Binshuo Hu [email protected] wrote:

First, I have to say I'm not very familiar with Gmock. When I look at its
support for output arguments, I wouldn't say the test code looks very
readable, despite its flexibility. I hope your solution wouldn't compromise
test code clarity, which is one of the biggest features of this project,
right?
I guess using lambdas to do the dirty work would suffice for now.


Reply to this email directly or view it on GitHub.

Eran
972-52-8387550

from fakeit.

binshuohu avatar binshuohu commented on June 15, 2024

···
When(Method(testobject, testfunction).Using(SetValue(value1),
SetValue(value2), _)).Return(true);
···
The Using kinda get me lost. The Using part ought to work with matchers, since they are conditions declared by the When. But here setters rather than matchers are used, I simply coudn't comprehend the intention of this statement. Does this statement mean it will set the first two arguments and return true for only one time?

I suppose if the SetValue appears in the Return part, it would be more clear.

from fakeit.

eranpeer avatar eranpeer commented on June 15, 2024

You're right,
I think I'll just skip it.
We'll stick to the lambda replacement for now.
Thanks.
On May 9, 2015 7:30 PM, "Binshuo Hu" [email protected] wrote:

···
When(Method(testobject, testfunction).Using(SetValue(value1),
SetValue(value2), _)).Return(true);
···
The Using kinda get me lost. The Using part ought to work with matchers,
since they are conditions declared by the When. But here setters rather
than matchers are used, I simply coudn't comprehend the intention of this
statement. Does this statement mean it will set the first two arguments and
return true for only one time?

I suppose if the SetValue appears in the Return part, it would be more
clear.


Reply to this email directly or view it on GitHub
#21 (comment).

from fakeit.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.