那么,即使这是可能的,它可能是一个坏主意。单元测试CheckService
应该只测试CheckService
,而不是Getboolean
。对于Getboolean
应该有一个单独的单元测试,它不依赖于任何其他方法。
正确的做法是将您的Getboolean
放在继承自接口的不同类中,然后将该接口传递给Service
构造函数(可能使用依赖注入),然后您可以嘲笑该接口并通过模拟实现在你的单元测试中。
例子:
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
}
然后在您的测试类(使用起订量语法,对不起,我不知道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));
}
这非常接近最近提出的[使用FakeItEasy方法来模拟方法](http://stackoverflow.com/questions/21733861/mocking-a-method-within-a-method-with-fakeiteasy ),其中我解释了如何去做你所要求的。但是,我仍然与其他人一起争论,这可能不是一个好主意。 –
布莱尔康拉德,它非常接近!谢谢(你的)信息。 (并且在我发布之前,我猜我必须更努力地寻找类似的东西!!)。 – Kyle