【问题标题】:Susbtitute behaviour of a method call in constructor with typemock用 typemock 替换构造函数中方法调用的行为
【发布时间】:2017-03-30 12:29:26
【问题描述】:

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

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

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

在上面的代码中,keyValue(global field) 是不断被设置的。 这些方法在每个决策算法中使用 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() 在构造函数中被调用, 我无法改变它的行为来检查字段。

任何启示/帮助都会有帮助。在此先感谢。

【问题讨论】:

  • 请明确一点,您是说在您的模拟MethodOne() 中您需要检查keyValue 的值,但不能因为它是私有的?
  • 隐私不是问题。我主要关心的是如何获取对象的当前状态(和当前字段值)。 Isolate api 可以做到这一点,但我不知道如何在创建实例之前使用此 api 模拟方法。
  • 嗯,我明白了。我不熟悉 Typemock(我使用 Moq),但我建议将该功能放在构造函数中对于测试而言可能不是一个好主意。构造函数通常只是设置初始状态而不是启动功能,并且您也不能在接口中定义构造函数。例如,您是否可以将构造函数代码移动到Process() 方法中?
  • 是的,我很清楚这是一个非常糟糕的设计决定。不幸的是,我无法重构任何经过测试的代码。该项目实际上处于一种奇怪的情况。但这就是我们使用 typemock Isolator 来测试通常无法测试的代码的原因。
  • 通常情况下 ;) 我可能会因为提出这个建议而被枪杀,但是如何使用 Process() 方法创建一个包装器类,该方法创建您要测试的实例,然后模拟包装器类?我知道有点阴暗。

标签: c# unit-testing constructor typemock


【解决方案1】:

如果我理解正确的话:

我想断言 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); 
}

这是你的想法吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 2011-06-19
    • 2019-04-19
    • 1970-01-01
    • 2013-08-10
    • 2018-08-20
    相关资源
    最近更新 更多