13

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

例如,假设我们有这个美妙的IBar界面。

public interface IBar
{
    int Foo<T>();    
}

我可以伪造对这个 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);
    }
}

谢谢!

4

1 回答 1

20

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

有一种方法可以指定对 fake 上的任何方法或属性的调用。查看此通过测试中的WhereWithReturnType位:

[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);
    }
}

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

于 2014-04-04T16:06:25.350 回答