2

这个 SO 问题解决了“可以”,但没有显示“如何”。我坚持让它启动并运行。任何人都可以提供一个例子吗?我试过了

public abstract class MyClass
{
  public abstract Counter Counter { get; }
  public int abstract Foo(int n);
  public virtual int Foo(string s)
  {
    return Foo(Counter.Count(s));
  }          
}

我想模拟 Foo(string s),这取决于抽象属性 Counter。我想模拟 Foo(string s) 的原因是因为我不想为 Counter 和 Foo(int n) 提供定义,因为验证码只使用了 Foo(string s) 。

方法一:

var sub = Substitute.For<MyClass>();
ShimMyClass.AllInstances.Func1Int32 = ... ; // alternate behavior for testing
VerifyLogic(sub);

方法二:

var sub = Substitute.For<MyClass>();
var shim = new ShimMyClass(sub)
{
   Func1Int32 = ... ; // alternate behavior for testing
};
VerifyLogic(shim.Instance);

两者都不起作用,调用原始类代码而不是 shim 代码。谢谢。

4

1 回答 1

1

假设包含要测试的类的库是 Lib。

namespace Lib
{
public interface Counter { int Count(string s); }

public abstract class AbstractClass : AbstractParent
{
    internal int Value { get; set; }

    public abstract int Foo(int x);
    public int Foo(string s) { return Foo(Counter.Count(s)); }
}

public abstract class AbstractParent
{
    internal abstract Counter Counter { get; }
}
}

在 Test 项目的 References 中找到 Lib。选择“添加假货程序集”。

    [TestMethod]
    public void AbstractMethod()
    {
        var instance = Substitute.For<AbstractClass>();

        using (ShimsContext.Create())
        {
            var instance = Substitute.For<AbstractClass>();

            Lib.Fakes.ShimAbstractClass.AllInstances.FooString =
                (_, s) => 1999;

            Assert.AreEqual(1999, instance.Foo("hello"));
        }
    }
于 2014-06-26T12:57:54.063 回答