以下是一个 C# .Net 示例,其中 Moq framework 在使用 Visual Studio 的 MSTest 中很有用。
观察TestOld() 和MoqTest() 之间的区别。两个测试的目的是一样的。但是在TestOld(),我需要写MyMemberManagerForTest的具体实现。而在MoqTest() 中,Moq 框架将为我完成任务。
_mockIMemberManager = new Mock<IMemberManager>();
_mockIMemberManager.Setup(x => x.GetMember(It.IsAny<int>())).Returns(member);
参考:How to Use Mock Library For Your Unit Testing In C#
[TestClass()]
public class TestMembershipManager
{
private LibraryCore _targetLibraryCore;
#region Old Test withou Moq
public class MyMemberManagerForTest : IMemberManager
{
public Member GetMember(int memberID)
{
Member member = new Member()
{
MemberID = 1,
FirstName = "Lijo",
MaximumBookCanBorrow = 4,
};
return member;
}
}
private IMemberManager _memberManager;
[TestMethod()]
public void TestOld()
{
_memberManager = new MyMemberManagerForTest();
_targetLibraryCore = new LibraryCore(_memberManager);
int memberID = 1;
double expected = 12;
double actual;
//TEST
actual = _targetLibraryCore.CalculateMembershipCost(memberID);
Assert.AreEqual(expected, actual);
}
#endregion
#region Test with Moq
private Mock<IMemberManager> _mockIMemberManager;
[TestMethod()]
public void MoqTest()
{
_mockIMemberManager = new Mock<IMemberManager>();
_targetLibraryCore = new LibraryCore(_mockIMemberManager.Object);
Member member = new Member()
{
MemberID = 1,
FirstName = "Lijo",
MaximumBookCanBorrow = 4,
};
_mockIMemberManager.Setup(x => x.GetMember(It.IsAny<int>())).Returns(member);
int memberID = 1;
double expected = 12;
double actual;
//TEST
actual = _targetLibraryCore.CalculateMembershipCost(memberID);
Assert.AreEqual(expected, actual);
}
#endregion
}
如您在重载的 LibraryCore 构造函数中所见,代码使用Dependency Injection 非常重要
public class LibraryCore
{
private readonly IMemberManager _memberManager;
public LibraryCore(IMemberManager memberManager)
{
this._memberManager = memberManager;
}
public double CalculateMembershipCost(int memberID)
{
double membershipCost = 0;
Member member = _memberManager.GetMember(memberID);
membershipCost = 10 + member.MaximumBookCanBorrow * 0.5;
return membershipCost;
}
}