通过代理模拟内部类型
使用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
我们嘲笑过酒吧
类。然后对接口成员进行排列,提供者
我们行动起来。最后,我们可以断言测试行为是预期的。