使用typemock

时间:2017-03-30 12:29:26

标签: c# unit-testing constructor typemock

所以我被要求测试这个构造函数调用。

public class testClass
{
  private bool keyValue = 45;
  public testClass()
  {
    MethodOne();

    keyValue = 900;
    MethodTwo();
    MethodThree();
    keyValue = 221;
  }
}

在上面的代码中,keyValue(全局字段)不断被设置。 这些方法在每个决策算法中使用keyValue。 我想声明keyValue设置为此值。

使用

可以获取字段的当前值
Isolate.whenCalled(() => obj.MethodOne())
.DoInstead(context => 
{
   testClass object = (testClass)context.Instance;
   // from here on, get any fields
}); 

我发现上面的代码只能在除构造函数之外的任何地方完成。(如果我错了,请纠正我)

另一点是我只能在使用MockManager API运行构造函数之前模拟方法。

[Test]
public void testMethod()
{
    Mock mockObj = MockManager.Mock(typeof(testClass));
    mockObj.ExpectCall("MethodOne");

    //instantiate tested object 
    testClass testedObj = new testClass();
}

虽然上面的代码断言在构造函数中调用了MethodOne(), 我无法改变其行为来检查字段。

任何启发/帮助都会有所帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

如果我理解正确的话:

  

我想声明keyValue设置为此值

相关测试将是:

[TestMethod]
public void TestMethod1()
{
    // Fake the object, Ignore calls, Invoke original ctor
    testClass tc = Isolate.Fake.Instance<testClass>(Members.ReturnNulls, ConstructorWillBe.Called);

    // Create a getter for keyValue and call it's original implementation
    Isolate.WhenCalled(() => tc.KeyVal).CallOriginal();

    // Assert that by the end of the ctor keyValue is equal to 221
    Assert.AreEqual(221, tc.KeyVal); 
}

这是你的想法吗?