C# 没有指定类型的伪泛型方法

C# 没有指定类型的伪泛型方法,c#,generics,fakeiteasy,C#,Generics,Fakeiteasy,我想知道是否有人可以为所有可能的类型(或指定的子类型)伪造一个泛型方法调用 例如,假设我们有一个很棒的IBar接口 public interface IBar { int Foo<T>(); } 公共接口IBar { int Foo(); } 我是否可以假装依赖于此IBar的Foo调用,而不必指定T为任何特定类型 [TestFixture] public class BarTests { [Test] public void BarFooDoesS

我想知道是否有人可以为所有可能的类型(或指定的子类型)伪造一个泛型方法调用

例如,假设我们有一个很棒的IBar接口

public interface IBar
{
    int Foo<T>();    
}
公共接口IBar
{
int Foo();
}
我是否可以假装依赖于此IBar的Foo调用,而不必指定T为任何特定类型

[TestFixture]
public class BarTests
{
    [Test]
    public void BarFooDoesStuff()
    {
        var expected = 9999999;
        var fakeBar = A.Fake<IBar>();

        A.CallTo(() => fakeBar.Foo<T>()).Returns(expected);

        var response = fakeBar.Foo<bool>();

        Assert.AreEqual(expected, response);
    }
}
[TestFixture]
公营易货者
{
[测试]
公共无效BarFooDoesStuff()
{
预期风险值=9999999;
var fakeBar=A.Fake();
A.CallTo(()=>fakeBar.Foo())。返回(预期);
var response=fakeBar.Foo();
Assert.AreEqual(预期,响应);
}
}

谢谢

我不知道有什么方法可以直接做到这一点。我认为DynamicProxy(Fakeitesy使用的)不支持开放泛型类型但是,如果您感兴趣,有一个变通方法

有一条路可以走。检查此通过测试中的
Where
with returnType
位:

[TestFixture]
public class BarTests
{
    [Test]
    public void BarFooDoesStuff()
    {
        var expected = 9999999;
        var fakeBar = A.Fake<IBar>();

        A.CallTo(fakeBar)
            .Where(call => call.Method.Name == "Foo")
            .WithReturnType<int>()
            .Returns(expected);

        var response = fakeBar.Foo<bool>();

        Assert.AreEqual(expected, response);
    }
}
[TestFixture]
公营易货者
{
[测试]
公共无效BarFooDoesStuff()
{
预期风险值=9999999;
var fakeBar=A.Fake();
A.CallTo(伪造)
.Where(call=>call.Method.Name==“Foo”)
.WithReturnType()
.回报(预期);
var response=fakeBar.Foo();
Assert.AreEqual(预期,响应);
}
}

尽管如此,我还是对它的用途感到好奇。您是否有一个实际使用伪造接口作为依赖项的示例测试?

+1这是一个很好的方法,但我也不相信需要以这种方式设置伪造接口。单元测试通常应该关闭泛型上的类型参数非常好!我没有具体的例子来说明。。。更多的好奇是这样的事情是否可以(容易地)完成。也许可以使用反射来限制假设置中的泛型类型?@AdamRalph是的,但is不一定要以静态方式来完成。例如,我使用的是SpecFlow,当从存储库中检索with Id时,我有类似于
的步骤。有了以上内容,我不必为每个步骤准备一个绑定方法。我只是用它来让我的所有验证助手方法在单元测试中默认通过<代码>A.CallTo(validationService).WithReturnType().Returns(true)A.CallTo(fakeBar)。其中(call=>call.method.Name==nameof(fakeBar.Foo))。WithReturnType()。返回(预期)