Telerik JustMock免费下载30天试用版

通过代理模拟内部类型

使用JustMock,您可以用InternalsVisibleToAttribute与模拟公共类型的方式相同。没有InternalsVisibleToAttribute你被迫嘲笑非公众成员。

在接下来的示例中,我们将使用以下样例类进行测试:

内部类FooInternal{内部的FooInternal(){生成器=新的StringBuilder();}公共StringBuilder Builder{获取{返回Builder;}}私有StringBuilder构建器;}公共类FooInternalCtor{内部FooInternalCtor(字符串名称){this.name = name;}公共字符串名称{获取{返回名称;}}私有字符串名称;}
Friend Class FooInternal Friend Sub New() m_builder = New StringBuilder() End Sub Public ReadOnly Property Builder() As StringBuilder Get Return m_builder End Get End Property Private m_builder As StringBuilder End Class Public Class FooInternalCtor Friend Sub New(name As String) Me。m_name = name结束子公共只读属性名称()作为字符串Get返回m_name结束获取结束属性私有m_name作为字符串结束类

通过代理模拟内部类型

前提是InternalsVisibleTo属性包含在AssemblyInfo.cs,让我们考虑下面的例子:

[TestMethod] public void ShouldMockInternalTypeViaProxy(){//安排var foo = Mock.Create(Behavior.CallOriginal);// Assert. isnotnull (foo.Builder);}
 Public Sub ShouldMockInternalTypeViaProxy() '安排Dim foo = Mock。创建(Of FooInternal)(Behavior.CallOriginal) 'Assert. isnotnull (foo.Builder)结束子

这里我们验证是否创建了mock并调用了它的构造函数。因此,foo。构建器将被分配。

要使用的密钥InternalsVisibleTo属性如下:

  • 对于不同于Silverlight的项目:InternalMocking #键
  • 对于Silverlight项目:InternalMocking # KeySilverlight

用内部构造函数创建Mock

可以模拟公开内部构造函数的类,方法与模拟公共类型相同。

[TestMethod] public void ShouldCreateMockWithInternalCtor(){//安排var expected = "hello";var foo = Mock。创建(x => {x. callconstructor (() => new FooInternalCtor(expected));x.SetBehavior (Behavior.CallOriginal);});// Assert. areequal (foo。名称,预期);}
 Public Sub shouldcreatemockwithinternaltor () 'Arrange Dim expected = "hello" Dim foo = Mock。Create(Of FooInternalCtor)(Function(x) x. callconstructor (Function() New FooInternalCtor(expected)) x. setbehavior (Behavior.CallOriginal) End Function) '断言Assert.AreEqual (foo。名称,预期)结束

的内部构造函数FooInternalCtor类。当喷火内部构造函数将被调用“你好”作为论证和名字财产将被分配“你好”分别。我们通过调用来验证foo。名字的断言阶段AAA模式。

模拟在基类中私有实现的接口成员

这里有一个接口,其中有一个成员和一个继承该接口的类。

公共接口IManager{对象提供者{获取;}}公共类FooBase: IManager{对象IManager。Provider {get{抛出新的NotImplementedException();}}}公共类Bar: FooBase {}
公共接口IManager只读属性提供程序()作为对象结束接口公共类FooBase实现IManager只读属性提供程序()作为对象实现IManager。Provider Get Throw New NotImplementedException() End Get End Property End Class公共类Bar继承了FooBase End类

派生类酒吧将是我们要模拟的对象,在下面的示例中。

[TestMethod] public void ShouldMockAnInterfaceMemberPrivatelyImplementedInBaseClass(){//安排var bar = Mock.Create< bar >();String expected = "dummy";Mock.Arrange(() => ((IManager)bar).Provider).Returns("dummy");// Act var actual = ((IManager)bar).Provider;//断言。AreEqual(预期,实际);}
 Public Sub shouldmockaninterfacememberprivyimplementedinbaseclass () '安排昏暗酒吧=模拟。Create(Of Bar)() Dim expected As String = "dummy" Mock.Arrange(Function() DirectCast(Bar, IManager).Provider).Returns("dummy") 'Act Dim actual = DirectCast(bar, IManager)。提供者断言断言。AreEqual(预期的,实际的)End Sub

我们嘲笑过酒吧类。然后对接口成员进行排列,提供者我们行动起来。最后,我们可以断言测试行为是预期的。

在本文中
Baidu
map