如何使用MS Fakes垫片与NSubstitute嘲笑?

时间:2014-06-20 19:29:50

标签: unit-testing mocking microsoft-fakes nsubstitute

This SO question 在没有显示"如何"的情况下解决了" can"。我坚持让它运行起来。任何人都可以提供一个例子吗?我试过了

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(字符串s),这取决于抽象属性Counter。我想模拟Foo(字符串s)的原因是因为我不想为Counter和Foo(int n)提供定义,因为验证码只使用了Foo(字符串s)。

方法1:

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

方法2:

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

两个都没有工作,调用原始类代码而不是shim代码。感谢。

1 个答案:

答案 0 :(得分: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。选择&#34;添加假装配&#34;。

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