Skip to content

How to argument match the generic parameter of a Func<T> with generic constraints? #767

@cado1982

Description

@cado1982

Question
Hello. I am trying to mock out this method so that any time it is called the Func is invoked and T is returned.

T New<T>(Func<T> instantiate) where T : Command;

Command is a base class for all of my commands. I thought I could do this

harness.CommandFactory
            .New(Arg.Any<Func<Command>>())
            .Returns(r => r.Arg<Func<Command>>()());

But of course this only matches if the caller passes in the base Command, not a derived class such as AddUserCommand.

Then I came across the newly added Arg.AnyType and thought this was perfect for my needs but I can't get the syntax right. The remark on the method comments seems to indicate that I need to create a derived class but I'm not sure I can for this specific case... "If the generic type parameter has constraints, you will have to create a derived class/struct that implements those constraints." This was the attempt, it fails because now I am back to having a derived type which never matches

public record AnyCommand : Command, Arg.AnyType;

harness.CommandFactory
            .New(Arg.Any<Func<AnyCommand>>())
            .Returns(r => r.Arg<Func<Command>>()());

Does anyone have an idea how/if this can be achieved?

Related links

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionQuestion on NSubstitute behaviour

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions