首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XUnit如何对业务对象进行单元测试,我应该模拟所有的东西吗?

XUnit如何对业务对象进行单元测试,我应该模拟所有的东西吗?
EN

Stack Overflow用户
提问于 2018-11-12 16:54:05
回答 1查看 1.2K关注 0票数 2

我正在尝试单元测试( Unit,XUnit)我的业务对象,其中它接受两个参数,并在返回输出之前执行一些操作。

代码语言:javascript
复制
    public OutPutModel MyBusinessObject(InputModel1 obj1, InputModel2 obj2)
    {
        // Performing some actions here including seding a call
        // to the data access layer to perform some db operation.
        return outPutModel;
    }

在我的XUnit中,我执行以下操作

代码语言:javascript
复制
    [Fact]
    public void MyBusinessObject_ReturnsOutPutModel()
    {
        var businessObjectMock = new Mock<IBusinessObject>();
        var obj1 = new Mock<InputModel1>();
        var obj2 = new Mock<InputModel2>();

        var outPutModel = new OutPutModel();

        var result = businessObjectMock.Setup(x => x.MyBusinessObject(obj1.Object, obj2.Object)).Returns(outPutModel);

        result.Equals(outPutModel);
    }

现在,我在业务对象(public OutPutModel MyBusinessObject(InputModel1 obj1,InputModel2 obj2))中设置了一个断点。在运行测试时,它不会到达断点,但仍然通过测试。我在这里做错什么了吗?我应该模拟所有东西,包括业务对象接口,还是仅仅模拟参数对象并调用业务对象的新实例?忘了提一下,我知道在业务对象中使用db级的东西不是个好主意。不幸的是,考虑到我别无选择。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-12 17:13:33

您正在错误地使用模拟框架。您似乎也在试图模拟正在测试的系统。

经验法则,只有当使用实现具有敲门效应时,才能模拟绝对必要的内容。

例如,如果BusinessObject依赖于数据访问层,如您在代码注释中所指出的,

代码语言:javascript
复制
public class BusinessObject: IBusinessObject{

    private readonly IDataAccess dataAccess;

    public BusinessObject(IDataAccess dataAccess) {
        this.dataAccess = dataAccess;
    }

    public OutPutModel SomeBusinessMethod(InputModel1 obj1, InputModel2 obj2) {
        // Performing some actions here including seding a call
        // to the data access layer to perform some db operation.
        var outPutModel = dataAccess.SomeMethod(obj1, obj2);

        return outPutModel;
    }
}

您将模拟在被测试的方法中使用的依赖项,然后调用被测试类的实际实例。

例如

代码语言:javascript
复制
[Fact]
public void MyBusinessObject_ReturnsOutPutModel() {
    //Arrange
    var expected = new OutPutModel {
        // populate as needed
    }
    //mock the dependency
    var dataAccessMock = new Mock<IDataAccess>();
    //Setup the mocked dependency
    dataAccessMock
        .Setup(_ => _.SomeMethod(It.IsAny<InputModel1>(), It.IsAny<InputModel2>()))
        .Returns(expected);
    //inject the dependency into the subject under test
    var businessObject = new BusinessObject(dataAccessMock.Object);
    //needed objects for the test
    var obj1 = new InputModel1 {
        //populate as needed
    };
    var obj2 = new InputModel2 {
        //populate as needed
    };

    //Act
    var actual = businessObject.SomeBusinessMethod(obj1, obj2);

    //Assert
    Assert.AreEqual(expected, actual);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53266736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档