c# - 单元测试中的部分模拟/伪造

标签 c# unit-testing mocking fakeiteasy

我对 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,而不是 GetbooleanGetboolean 应该有一个单独的单元测试,它不依赖于任何其他方法。

正确的方法是让你的 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/

相关文章:

java - 读取包含输入值的文件并使用结果生成 .out

c++ - 如何在 googlemock 中创建部分(混合)模拟?

C# WCF - 客户端/服务器 - System.OutOfMemory 异常

c# - 总结一个很长的二进制数的数字?

c# - Entity Framework 迁移 NuGet 错误

Java:单元测试级联外部接口(interface)

c++ - 对于 gtest,如何模拟名称相同但类型不同的方法

c# - 我怎样才能得到删除文件的用户?

python - 您如何使用 tornado.testing 创建 WebSocket 单元测试?

eclipse - 在 OS X 上使用 Eclipse 设置 Google 测试 (gtest)