Telerik JustMock免费下载30天试用版

模拟属性

模拟属性类似于模拟方法,但是有一些情况需要特别注意,比如模拟索引器和特定的集合操作。

为了说明该功能的用法,我们将使用以下接口定义:

示例设置

公共接口IFoo {int值{get;设置;}}
公共接口IFoo属性值()作为整数结束接口

属性的Getter

属性get可以像任何其他方法调用一样被模拟。您可以为特定调用安排返回语句(使用返回),抛出异常(使用抛出),在调用时引发事件(使用提高)等。

让我们考虑下面的例子:

示例1:排列getter的返回值

[TestMethod] public void ShouldFakePropertyGet(){//安排var foo = Mock.Create();Mock.Arrange(() => foo.Value).Returns(25);//行为var实际= foo.Value;//断言。AreEqual(25、实际);}
 Public Sub shouldakepropertyget () '安排Dim foo = Mock。Create(Of IFoo)() Mock.Arrange(Function() foo.Value). return (25) 'Act Dim actual As Integer = foo。Value ' Assert '断言。AreEqual(25, actual)结束子节点

这里我们测试调用foo。价值属性返回我们安排的值。

属性设置

可以对索引器和普通属性模拟set操作。集合操作使用一个特殊的集合入口点来模拟,这个入口点是Mock.ArrangeSet(λ)

当您想要确保或验证特定属性是否设置为预期值时,属性集模拟非常有用。出于这个原因,我们使用a严格的嘲笑

示例2:模拟行为为Strict时的模拟设置器

[TestMethod] [ExpectedException(typeof(StrictMockException))] public void ShouldThrowExceptionOnTheThirdPropertySetCall(){//安排var foo = Mock.Create(Behavior.Strict);Mock.ArrangeSet(() => foo。Value = Arg。匹配< int >(x => x > 3)); // Act foo.Value = 4; foo.Value = 5; // throws MockException because matching criteria is not met foo.Value = 3; }
  Public Sub ShouldThrowExceptionOnTheThirdPropertySetCall() '安排Dim foo = Mock。Create(Of IFoo)(Behavior.Strict) Mock.ArrangeSet(Sub() foo。Value = Arg。匹配(Of Integer)(Function(x) x > 3)) 'foo。价值= 4 foo.Value = 5 ' throws MockException because matching criteria is not met foo.Value = 3 End Sub

参数。匹配< int >匹配器,我们设置了一个要求foo。价值属性的值应大于3。当我们将值设置为小于3的数字时,aMockException抛出。

有关如何使用参数和匹配器的详细信息,请参阅匹配器帮助主题。

的情况下断言属性集宽松的嘲笑,可用的语法如下:Mock.AssertSet(λ)

因此,我们可以做:

示例3:模拟行为为Loose时的模拟setter

[TestMethod] public void ShouldAssertPropertySet(){//安排var foo = Mock.Create();Mock.ArrangeSet(() => foo。Value = 1);//操作foo。Value = 1;// Assert Mock.AssertSet(() => foo。Value = 1);}
 Public Sub ShouldAssertPropertySet() '安排Dim foo = Mock。Create(Of IFoo)() Mock.ArrangeSet(Sub() foo)Value = 1) 'foo。价值= 1 ' Assert Mock.AssertSet(Sub() foo.Value = 1) End Sub

这里我们要确保foo。价值实际上是设置为1

做的的示例,说明如何使用DoInstead在属性集上。

索引器

索引器是一种特殊的属性,它使对象能够以类似于数组的方式被索引。

考虑一个带有indexer属性的接口。

示例设置

公共接口IIndexedFoo {string this[int key] {get;设置;}}
公共接口IIndexedFoo默认属性项(key为整数)为字符串结束接口

示例4说明如何控制索引器属性getter的返回值。

示例4:为不同的索引返回不同的值

//创建模拟var indexedFoo = mock .Create();//设置调用索引0返回ping,调用索引1返回pong。Mock.Arrange(() => indexedFoo[0]).Returns("ping");Mock.Arrange(() => indexedFoo[1]).Returns("pong");//行为字符串actualFirst = indexedFoo[0];字符串actualSec = indexedFoo[1];//断言。AreEqual(“平”,actualFirst);断言。AreEqual(“乒乓球”,actualSec);
创建模拟Dim IndexedFoo = mock。Create(Of IIndexedFoo)安排对索引0的调用返回ping,对索引1的调用返回pong。Mock.Arrange(Function() IndexedFoo(0)).Returns("ping") Mock.Arrange(Function() IndexedFoo(1)).Returns("pong") 'Act Dim actualFirst As String = IndexedFoo(0) Dim actualSec As String = IndexedFoo(1) '维护维护。AreEqual("ping", actualFirst)断言。AreEqual(“乒乓球”,actualSec)

断言索引集

确保将特定索引设置为特定值。

示例5:安排索引器设置器

[TestMethod] [ExpectedException(typeof(StrictMockException))] public void ShouldThrowExceptionForNotArrangedPropertySet() {// Arrange var foo = Mock.Create(Behavior.Strict);// foo[0]只能设置为"foo"。Mock.ArrangeSet(() => {foo[0] = "foo";});//操作foo[0] = "foo";//下面一行不满足安排的条件并抛出一个StrictMockException。Foo [0] = "bar";}
  Public Sub shouldthrowexceptionfornotrangedpropertyset () '安排Dim foo = Mock。创建(IIndexedFoo) (Behavior.Strict)' foo[0]只能设置为' foo '。Mock.ArrangeSet(Sub() foo(0) = "foo") 'Act foo(0) = "foo" '下面一行不满足安排的条件,并抛出一个StrictMockException。foo(0) = "bar"结束子

的零索引项后,上面的代码抛出异常喷火被设置为与期望值不同的值-即。喷火

断言具有匹配条件的索引集

确保将特定索引设置为与特定条件匹配的值。

示例6:使用匹配器安排索引器设置器

[TestMethod] [ExpectedException(typeof(StrictMockException))] public void ShouldAssertIndexedSetWithMatcher(){//安排var foo = Mock.Create(Behavior.Strict);// foo[0]只能设置为"ping"。Mock.ArrangeSet(() => {foo[0] = Arg。匹配(x => x = equals ("ping"));});// foo[1]只能设置为任意字符串。Mock.ArrangeSet(() => {foo[1] = Arg.IsAny();});//操作foo[0] = "ping";Foo [1] = "pong"; // The following line does not satisfy the matching criteria and throws a MockException. foo[0] = "bar"; }
  Public Sub ShouldAssertIndexedSetWithMatcher() '安排Dim foo = Mock。创建(IIndexedFoo) (Behavior.Strict)foo[0]只能设置为“ping”。Mock.ArrangeSet(Sub() foo(0) =参数。(Function(x) x. equals ("ping")))' foo[1]只能设置为任意字符串。Mock.ArrangeSet(Sub() foo(1) = "pong") 'Act foo(0) = "ping" foo(1) = "pong" '下一行不满足匹配条件并抛出MockException foo(0) = "bar" End Sub

前两个集合调用满足要求。然而,第三个叫——Foo [0] = "bar"抛出异常,因为我们安排了零索引项只能设置为“foo”

在本文中
Baidu
map