Telerik JustMock?下载30天免费试用

排列一个类的所有实例

Telerik®JustMock使您能够创建单个排列并将其应用于每个类实例无论它是在当前上下文中的何时何地创建的。使用这个特性,您不需要显式地安排每个实例。您会发现这很方便,特别是当您必须模拟第三方控件和工具时,而您几乎无法控制它们的创建方式。

这是一个高架特征。指主题,以了解更多关于Telerik JustMock的商业版本和免费版本之间的差异。

默认情况下,所有模拟都绑定到一个实例,这是预期的行为。本主题描述可用于更改该行为并将安排应用于类型的所有实例的方法。

模拟创建一个新的类对象

在单元测试时,在测试代码中创建一个新的类实例通常是一个巨大的挑战。使用JustMock,您可以轻松地模拟实例的构造函数,以便您可以对其应用特定的行为或更改其返回值。让我们假设我们有以下类:

示例设置

公共类FooWithNotImplementedConstructor{公共FooWithNotImplementedConstructor(){抛出新的NotImplementedException();}}
公共类FooWithNotImplementedConstructor公共子New()抛出新的NotImplementedException()结束子结束类

我们可以像示例1

例1:安排对象的构造函数的行为

[TestMethod] public void ShouldMockConstructorForFutureInstances() {// Arrange Mock.Arrange(() => new FooWithNotImplementedConstructor()).DoNothing();//直接排列构造函数// Act var myNewInstance = new FooWithNotImplementedConstructor();//这将不会抛出异常// Assert Assert. isnotnull (myNewInstance);断言。IsInstanceOfType (myNewInstance typeof (FooWithNotImplementedConstructor));}
公共子ShouldMockConstructorForFutureInstances() 'Arrange Mock.Arrange(Function() New FooWithNotImplementedConstructor()).DoNothing() '直接排列构造函数“Act Dim myNewInstance = New FooWithNotImplementedConstructor()”这将不会抛出异常` Assert Assert. isnotnull (myNewInstance) Assert。IsInstanceOfType(myNewInstance, GetType(FooWithNotImplementedConstructor))结束子

这是适用的DoNothing类型的每个新实例的构造函数FooWithNotImplementedConstructor在测试方法期间调用。

为构造函数安排返回值

您可以为创建的新对象安排返回值。让我们假设我们有以下类:

示例设置

公共类FooWithProp{公共字符串MyProp{获取;设置;}} public FooWithProp GetNewInstance(){返回新的FooWithProp();}
公共类FooWithProp公共属性MyProp作为字符串结束类公共函数GetNewInstance()作为FooWithProp返回新的FooWithProp()结束函数

类的每个新实例都可以轻松地安排FooWithProp类,返回相同类型的预定义对象:

例2:调用构造函数时返回预定义对象

[TestMethod] public void ShouldReturnNewObjectForFutureInstances() {// Arrange var testObj = new FooWithProp() {MyProp = "Test"};//直接排列表达式返回预定义对象Mock.Arrange(() => new FooWithProp()).Returns(testObj);// Act var myNewInstance = GetNewInstance();// Assert Assert. isnotnull (myNewInstance);断言。IsInstanceOfType (myNewInstance typeof (FooWithProp));//断言返回的实例等于预定义的Assert。AreEqual(“测试”,myNewInstance.MyProp);}
公共子ShouldReturnNewObjectForFutureInstances() '排列Dim testObj = New FooWithProp() testObj.;MyProp = "Test" '直接排列表达式以返回预定义对象Mock.Arrange(Function() New FooWithProp()).Returns(testObj) 'Act Dim myNewInstance = GetNewInstance() 'Assert Assert. isnotnull (myNewInstance) Assert。IsInstanceOfType(myNewInstance, GetType(FooWithProp)) '断言返回的实例等于预定义的Assert。AreEqual("Test", myNewInstance.MyProp

属性的每个新实例都可以使用FooWithProp在测试方法之外输入。不过,它只适用于在测试上下文中执行的代码。

忽略期望的实例

在其中创建的实例示例3对象是类型吗用户数据,它只有一个方法ReturnFive ()它返回一个整数。然后我们模拟调用ReturnFive ()方法用于模拟实例(userDataMock)的用户数据类。有了这个设置,ReturnFive ()方法的任何其他实例都不会被模拟用户数据类。

示例设置

公共类UserData{公共int ReturnFive(){返回5;}}
Public Class UserData Public Function ReturnFive() As Integer Return 5 End Function结束类

例3:为特定实例安排方法

[TestMethod] public void ShouldArrangeReturnOnlyForSpecificInstance() {// Arrange var userDataMock = Mock.Create();Mock.Arrange(() => userDataMock.ReturnFive()).Returns(7);// Assert。AreEqual (7, userDataMock.ReturnFive ());断言。AreEqual(5, new UserData().ReturnFive());}
 Public Sub ShouldArrangeReturnOnlyForSpecificInstance() '排列Dim userDataMock = Mock。Create(Of UserData)() Mock.Arrange(Function() userDataMock.ReturnFive()).Returns(7) '维护维护。AreEqual(7, userDataMock.ReturnFive())断言。AreEqual(5, New UserData().ReturnFive())结束

如果你需要应用未来的嘲笑,并确保所有用户数据类的相同模拟版本ReturnFive ()方法,您可以调用IgnoreInstance ()

例4:为所有对象实例安排方法

[TestMethod] public void shouldarrangereturnforfutureuserdatainstance () {// Arrange var userDataMock = Mock.Create();Mock.Arrange(() => userDataMock.ReturnFive()).IgnoreInstance().Returns(7);// Assert。AreEqual (7, userDataMock.ReturnFive ());断言。AreEqual(7, new UserData().ReturnFive());}
 Public Sub shouldarrangereturnforfutureuserdatainstance () '排列Dim userDataMock = Mock。Create(Of UserData)() Mock.Arrange(Function() userDataMock.ReturnFive()).IgnoreInstance().Returns(7) '维护维护。AreEqual(7, userDataMock.ReturnFive())断言。AreEqual(7, New UserData().ReturnFive())结束

IgnoreInstance应用时,ReturnFive ()方法会根据你设定的期望起作用模拟。安排

在设定未来期望时,你也可以使用流利的嘲笑API如下例所示:

例5:使用流畅的语法为所有对象实例安排方法

[TestMethod] public void ShouldArrangeReturnForFutureUserDataInstances_Fluent() {// Arrange var userDataMock = Mock.Create();userDataMock。安排(mock => mock.ReturnFive()).IgnoreInstance().Returns(7); // Assert Assert.AreEqual(7, userDataMock.ReturnFive()); Assert.AreEqual(7, new UserData().ReturnFive()); }
 Public Sub ShouldArrangeReturnForFutureUserDataInstances_Fluent() '排列Dim userDataMock = Mock。Create(Of UserData)() userDataMock.Arrange(Function(x) x. returnfive ()).IgnoreInstance().Returns(7) '断言Microsoft.VisualStudio.TestTools.UnitTesting.Assert。AreEqual(7, userDataMock.ReturnFive())AreEqual(7, New UserData().ReturnFive())结束

为虚方法使用IgnoreInstance

你也可以申请IgnoreInstance到虚拟方法。假设我们有一个简单的类计算器它有一个虚拟方法总和

示例设置

公共类计算器{公共虚拟int Sum(){返回0;}}
公共类计算器公共可覆盖函数Sum() As Integer Return 0结束函数结束类

现在我们可以用IgnoreInctance以完全相同的方式:

例6:忽略virtual方法的实例

[TestMethod] public void ShouldApplyIgnoreInstanceToVirtual(){//安排var计算器= Mock.Create<计算器>();Mock.Arrange(() => calculator.Sum()).IgnoreInstance().Returns(10);/ /维护维护。AreEqual (10, calculator.Sum ());断言。AreEqual(10, new Calculator().Sum());}
 Public Sub ShouldApplyIgnoreInstanceToVirtual()“安排Dim计算器= Mock。Create(Of Calculator)() Mock.Arrange(Function() Calculator . sum ()).IgnoreInstance().Returns(10)Assert断言。AreEqual(10, calculator.Sum())断言。AreEqual(10, New Calculator().Sum())结束

忽略集合的实例

本节将展示如何安排属性为对象的每个实例返回一个伪集合。为了演示这一点,我们将使用喷火下面的类。

示例设置

public class Foo {public Foo() {} private List collection;public List RealCollection {get{返回collection;}}}
          
Public Class Foo Public Sub New() End Sub Private collection As List(Of Object) Public ReadOnly Property RealCollection() As List(Of Object) Get Return collection End Get End Property End Class

例7控件中使用的伪集合的创建,以及如何安排Foo。RealCollection属性总是返回假集合。

例7:构造假集合并安排property get返回它

public IList FakeCollection() {List resultCollection = new List();resultCollection.Add (asd);resultCollection.Add (123);resultCollection.Add(真正的);返回resultCollection;} [TestMethod]公共无效ShouldReturnFakeCollectionForFutureCall() {var fooMocked = Mock.Create();var expectedCollection = FakeCollection();// Arrange Mock.Arrange(() => foomoced . realcollection).IgnoreInstance().ReturnsCollection(expectedCollection);// Act var actualArrangedCollection = foomoced . realcollection;var actualUnArrangedCollection = new Foo().RealCollection; // Assert // Asserting for the arranged instance Assert.AreEqual(expectedCollection.Count, actualArrangedCollection.Count); Assert.AreEqual(expectedCollection.FirstOrDefault(), actualArrangedCollection.FirstOrDefault()); // Asserting for a new unarranged instance Assert.AreEqual(expectedCollection.Count, actualUnArrangedCollection.Count); Assert.AreEqual(expectedCollection.FirstOrDefault(), actualUnArrangedCollection.FirstOrDefault()); }
          
Public Function FakeCollection() As IList(Of Object) Dim resultCollection As New List(Of Object)() resultCollection. add ("asd") resultCollection. add (123) resultCollection. add (True) Return resultCollection End Function  Public Sub ShouldReturnFakeCollectionForFutureCall() Dim fooMocked = Mock。创建(Of Foo)() Dim expectedCollection = FakeCollection() '排列Mock.Arrange(Function() foomoced . realcollection).IgnoreInstance().ReturnsCollection(expectedCollection) 'Act Dim actualArrangedCollection = fooMocked。RealCollectionDim actualUnArrangedCollection = New Foo().RealCollection ' Assert ' Asserting for the arranged instance Assert.AreEqual(expectedCollection.Count, actualArrangedCollection.Count) Assert.AreEqual(expectedCollection.FirstOrDefault(), actualArrangedCollection.FirstOrDefault()) ' Asserting for a new unarranged instance Assert.AreEqual(expectedCollection.Count, actualUnArrangedCollection.Count) Assert.AreEqual(expectedCollection.FirstOrDefault(), actualUnArrangedCollection.FirstOrDefault()) End Sub

您可以看到测试逻辑与前面的测试相同,唯一的区别是这次返回了一个集合。

跨线程模拟所有实例

跨所有线程模拟是一种不安全的操作,因为它可能损害测试框架的稳定性。默认情况下,忽略实例的安排仅对当前线程有效。要做出忽略实例且在所有线程上都有效的安排,请添加.OnAllThreads ()安排条款:

例8:使用OnAllThreads

Mock.Arrange(() => new DBContext()).DoNothing().OnAllThreads();
Mock.Arrange(Function() New DBContext()).DoNothing().OnAllThreads()

另请参阅

在本文中
Baidu