continuación se presenta un ejemplo de C# .Net donde un Moq framework
es útil en un MSTest usando Visual Studio.
Observe la diferencia entre TestOld()
y MoqTest()
. El propósito de ambas pruebas es el mismo. Pero en TestOld()
, necesito escribir MyMemberManagerForTest
implementación concreta. Mientras que en MoqTest()
, el framework Moq me hará la tarea.
_mockIMemberManager = new Mock<IMemberManager>();
_mockIMemberManager.Setup(x => x.GetMember(It.IsAny<int>())).Returns(member);
Referencia: 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
}
Para este tipo de pruebas para trabajar, es importante que el código para utilizar Dependency Injection
como se puede ver en el constructor LibraryCore sobrecargado
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;
}
}
Gracias por la respuesta. La mayor parte de mi trabajo se realiza en entornos científicos y tiende a proyectos relativamente pequeños. Sin embargo, me estoy inclinando por un marco de trabajo de xunit, especialmente porque es probable que use otros cuando cambio de idioma. – GreenMatt