Telerik JustMock免费下载30天试用版

嘲笑的代表

Telerik®JustMock您可以模拟委托并对其使用所有模拟功能。例如,您可以对它们的调用进行断言,安排某些期望,然后将它们传递给被测系统。本主题将解释如何使用该功能。

示例设置

对于本主题中的示例,让我们假设我们有以下内容喷火类:

示例设置

public class Foo {public Func FuncDelegate {get;设置;}公共int GetInteger(int toThisInt){返回FuncDelegate(toThisInt);}}
Public Class Foo Public Property FuncDelegate() As Func(Of Integer, Integer) Get Return m_FuncDelegate End Get Set(value As Func(Of Integer, Integer)) m_FuncDelegate = value End Set End Property Private m_FuncDelegate As Func(Of Integer, Integer) Public Function GetInteger(toThisInt As Integer) As Integer返回FuncDelegate(toThisInt) End Function结束类结束

断言委托事件

您可以使用JustMock来验证委托是否被实际调用,如示例1

例1:测试方法中的委托是否被实际调用

[TestMethod] public void shouldarrangeceexpectation(){//安排var delegateMock = Mock。创建< Func < int, int > > ();Mock.Arrange(() => delegateMock(Arg.AnyInt)). mustbeccalled ();// Act var foo = new foo ();foo。FuncDelegate = delegateMock;var actual = foo.GetInteger(123);// Assert Mock.Assert(delegateMock);}
 Public Sub shouldarrangeceexpectation () '安排Dim delegateMock = Mock。Create(Of Func(Of Integer, Integer))() Mock.Arrange(Function() delegateMock(Arg.AnyInt)). mustbeccalled () 'Act Dim foo = New foo () foo。FuncDelegate= delegateMock Dim actual = foo.GetInteger(123) ' Assert Mock.Assert(delegateMock) End Sub

来自示例1断言在测试方法执行期间,Func < int, int >无论使用整数参数,都至少调用一次。

您还可以验证调用的顺序和次数。有关该功能的更多详细信息,请查看断言发生的话题。

安排预期回报

为了测试GetInteger方法在不同的场景中,我们可能需要安排一个特定的行为FuncDelegate.这可以这样做:

示例2:更改委托的返回值

[TestMethod] public void shouldarrangereturexpectations(){//安排var delegateMock = Mock。创建< Func < int, int > > ();//安排Func< int, int>当以10作为参数调用时,委托返回20。Mock.Arrange(() => delegateMock(10)).Returns(20);// Act var foo = new foo ();foo。FuncDelegate = delegateMock;var actual = foo.GetInteger(10);//断言。AreEqual(20、实际);}
 Public Sub shouldarrangereturexpectation () '安排Dim delegateMock = Mock。Create(Of Func(Of Integer, Integer))() '安排Func< int, int>当以10作为参数调用时,委托返回20。Mock.Arrange(Function() delegateMock(10)).Returns(20) 'Act Dim foo = New foo () foo。FuncDelegate= delegateMock Dim actual = foo.GetInteger(10) ' Assert Assert.AreEqual(20, actual) End Sub

在被测系统中传递委托模拟

对于本节中的示例,如下所示DataRepository类使用:

示例设置

公共类DataRepository{公共字符串GetCurrentUserId(Func callback){返回callback();}公共无效approvecredals (Action callback){//这里有一些逻辑…回调(1);}}
公共类DataRepository公共函数GetCurrentUserId(callback作为Function (Of String))作为String返回callback()结束函数公共子approvecredals (callback作为Action(Of Integer)) '这里有一些逻辑…callback(1) End Sub结束类

第一个测试方法将解释如何在上述测试系统中通过预先安排的委托模拟:

示例3:将委托模拟作为方法参数传递

[TestMethod] public void ShouldPassPrearrangedDelegateMockAsArgument() {// Arrange var delegateMock = Mock.Create>();Mock.Arrange(() => delegateMock()).Returns("Success");//操作var testInstance = new DataRepository();var actual = testInstance.GetCurrentUserId(delegateMock);//断言。AreEqual(“成功”,实际);}
公共子ShouldPassPrearrangedDelegateMockAsArgument() '安排Dim delegateMock = Mock。Create(Of Func(Of String))() Mock.Arrange(Function() delegateMock()).Returns("Success") 'Act Dim testInstance = New DataRepository() Dim actual = testInstance. getcurrentuserid (delegateMock) '维护维护。AreEqual(“Success”,实际)结束

第二个测试方法演示了如何在上述被测系统中传递委托模拟,并断言其发生,而不是在测试执行期间调用其原始逻辑。

示例4:将委托模拟作为方法参数传递,并断言其发生

[TestMethod] public void ShouldPassDelegateMockAsArgumentAndAssertItsOccurrence() {bool isCalled = false;//安排var delegateMock = Mock.Create>();//不调用委托的原始实现,//它应该只在调用时将isCalled设置为true。Mock.Arrange(() => delegateMock(Arg.AnyInt)).DoInstead(() => isCalled = true);//操作var testInstance = new DataRepository();testInstance.ApproveCredentials (delegateMock);// Assert. itrue (isCalled);}
 Public Sub ShouldPassDelegateMockAsArgumentAndAssertItsOccurrence() Dim isCalled As Boolean = False ' Arrange Dim delegateMock = Mock。Create(Of Action(Of Integer))() '安排不是调用委托的原始实现,它应该只在调用时将isCalled设置为true。Mock.Arrange(Sub() delegateMock(Arg.AnyInt)).DoInstead(Sub() isCalled = True) 'Act Dim testInstance = New DataRepository() testInstance. approvecredals (delegateMock) 'Assert. istrue (isCalled)结束子

另请参阅

在本文中
Baidu
map