【发布时间】:2019-04-15 10:39:21
【问题描述】:
我正在尝试对我的业务对象进行单元测试 (XUnit),它需要 2 个参数并在返回输出之前执行一些操作。
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 中,我正在执行以下操作
[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)) 中设置了一个断点。在运行测试时,它没有达到断点但仍然通过了测试。我在这里做错了吗?我应该模拟包括业务对象接口在内的所有内容,还是只模拟参数对象并调用业务对象的新实例? 附言忘了提一下,我知道在业务对象中包含数据库级别的东西并不是一个好主意。不幸的是,想想我别无选择。
【问题讨论】:
-
你使用了错误的模拟框架。您似乎还试图模拟被测系统
-
您应该模拟任何依赖于无法保证处于特定状态的外部服务的元素 - 例如数据库、外部 Web 服务或文件。
-
据我所知,你在这里没有测试任何东西。您将方法设置为返回某个对象,然后检查该对象是否等于自身
-
经验法则,仅模拟绝对必要且仅在使用实现具有连锁效应时才模拟
-
@Nkosi,通过提供一个实际的实现,它不会成为一个集成测试吗?
标签: c# mocking xunit xunit.net