我对 FakeItEasy(或其他模拟对象,因为我相信它们非常相似)有疑问。以下是我的 puesdocode:
public class Service
{
public void CheckService()
{
...
Status status;
if (Getboolean)
{
status = Status.Pass;
}
else
{
status = Status.NotPass;
}
}
public bool Getboolean()
{
.....
if (someConditions)
return true;
else
return false;
}
}
public enum Status
{
Pass = 0,
NotPass = 1
}
现在,我必须为类(class)编写一些单元测试代码。是否可以在我真正使用 baseMethod() 测试 Checkservice() 时模拟 GetBoolean()?如果没有,我应该如何修改代码?
谢谢, 凯尔
最佳答案
好吧,即使那是可能的,也很可能是个坏主意。单元测试 CheckService
应该只测试 CheckService
,而不是 Getboolean
。 Getboolean
应该有一个单独的单元测试,它不依赖于任何其他方法。
正确的方法是让你的 Getboolean
在一个继承自接口(interface)的不同类中,你可以将该接口(interface)传递给 Service
构造函数(可能使用依赖注入(inject)),那么您可以模拟该接口(interface)并在您的单元测试中传递模拟实现。
例子:
public interface ILogicChecker
{
bool Getboolean();
}
public class LogicChecker : ILogicChecker
{
public bool Getboolean()
{
//.....
if (someConditions)
return true;
else
return false;
}
}
public class Service
{
ILogicChecker logicChecker;
Status status;
public Service(ILogicChecker logicChecker)
{
this.logicChecker = logicChecker;
}
public void CheckService()
{
//...
if (logicChecker.Getboolean())
{
status = Status.Pass;
}
else
{
status = Status.NotPass;
}
}
}
public enum Status
{
Pass = 0,
NotPass = 1
}
然后在你的测试类中(使用 Moq 语法,抱歉我不知道 FakeItEasy):
[Test]
public void CheckService_WithTrueGetboolean_ShouldHave_PassStatus
{
//Arrange
var logicCheckerMock = new Mock<ILogicChecker>();
logicCheckerMock.Setup(x => x.Getboolean()).Returns(true);
var service = new Service(logicCheckerMock.Object);
//Act
service.CheckService();
//Assert
Assert.That(service.Status, Is.EqualTo(Status.Pass));
}
[Test]
public void CheckService_WithFalseGetboolean_ShouldHave_NotPassStatus
{
//Arrange
var logicCheckerMock = new Mock<ILogicChecker>();
logicCheckerMock.Setup(x => x.Getboolean()).Returns(false);
var service = new Service(logicCheckerMock.Object);
//Act
service.CheckService();
//Assert
Assert.That(service.Status, Is.EqualTo(Status.NotPass));
}
关于c# - 单元测试中的部分模拟/伪造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22082154/