繁体   English   中英

使用Moq`It.Is`验证具有私有字段的构造函数参数/对象

[英]Using Moq `It.Is` to verify constructor parameter / object with private field

很简单的例子:

public class Test
{
     private int _field;

   public Test(int field)
   {
     _field = field;
   }
}

现在我想检查是否使用类型为Test的参数调用方法,其构造函数参数等于5

_mock.Verify(x => x.Method(It.Is<Test>(constructor parameter equal to 5)));

如果我理解正确,你有一个SUT( SystemUnderTest ,下面),它调用一个依赖项( IDependency ),你已经用类( Test )的对象IDependency它,它不暴露公共getter属性。 就目前而言,您需要使用像反射这样的黑客来检查私有值,例如:

  public static TReturn GetPrivateField<TIn,TReturn>(TIn instance, 
                                                     string fieldName)
  {
     var fieldInfo = typeof(TIn).GetField(fieldName, BindingFlags.NonPublic | 
                             BindingFlags.Instance);
     return (fieldInfo != null)
               ? (TReturn)fieldInfo.GetValue(instance)
               : default(TReturn);
  }

  [Test]
  public void EnsureMethod()
  {
     var mock = new Mock<IDependency>();
     var sut = new SystemUnderTest(mock.Object);
     sut.DoSomethingGoodWithTest();

     mock.Verify(x => x.Method(It.Is<Test>(
                     t => GetPrivateField<Test, int>(t, "_field") == 5)));
  }

显然这远非理想,如果可能的话,可以重新考虑这种方法:

如果您无法将访问可见性更改为Test._field例如使用公共getter,但是能够更改正在测试的类的设计,则可以选择使用可注入工厂来创建Test类,例如使用像IFactory.Create(int x)这样的方法。 这样您就可以在测试期间模拟工厂,然后拦截Create调用并验证SUT确实正在创建具有所需构造参数的Test对象。

而不是测试构造函数,你应该以某种方式测试该属性是否设置了正确的值。 看看您是否可以使用方法或属性或任何其他方式公开它。

如果您无法访问该类以显示该属性,则必须查看它的使用方式,即您要查找使用5或10或其他方式初始化的副作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM