C# 没有指定类型的伪泛型方法
我想知道是否有人可以为所有可能的类型(或指定的子类型)伪造一个泛型方法调用 例如,假设我们有一个很棒的IBar接口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
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)如果需要,我可以稍后用特定的行为重写一个方法。如果您使用的是C#6,那么可以通过使用“nameof”:A.CallTo(fakeBar)。其中(call=>call.method.Name==nameof(fakeBar.Foo))。WithReturnType()。返回(预期)代码>