我正在尝试为一个类编写单元测试,但是该类具有在创建类时启动的私有变量。
public class OrderFormService : IOrderFormService
{
private readonly IOrderItems _orderItems;
private readonly string _orderStartingGroup;
// constructor
public OrderFormService(IOrderItems orderItems)
{
_orderItems = orderItems;
_orderStartingGroup = "Sales";
{
// Other Methods
}
我现在正在尝试编写单元测试并测试此类中的方法,它利用了_orderStartingGroup变量...
[TestFixture]
public class OrderFormServiceTests
{
private ITreatmentFormService _service;
private Mock<IOrderItems> _orderItems;
[SetUp]
public void SetUp()
{
_orderItems = new Mock<IOrderItems>();
_service = new OrderFormService(_orderItems);
}
}
是否可以在OrderFormServiceTest中设置_orderStartingGroup,以便将其用于单元测试中以测试OrderFormService中的某些方法?如果是这样,我该怎么做?我尝试使用谷歌搜索,但是结果一直在谈论要测试的类中访问私有变量,但这不是我要尝试的事情。
预先感谢:)
答案 0 :(得分:2)
即使有 一种直接通过单元测试方法设置私有字段的方法,也会破坏一两个架构原则。
有几种方法可以解决此问题。最简单的解决方案是通过添加可选参数来更改ctor签名:
// constructor
public OrderFormService(IOrderItems orderItems, string orderStartingGroup = null)
{
_orderItems = orderItems;
_orderStartingGroup = orderStartingGroup ?? "Sales";
{
并在单元测试中使用它:
[SetUp]
public void SetUp()
{
_orderItems = new Mock<IOrderItems>();
_service = new OrderFormService(_orderItems, “testValue”);
}
答案 1 :(得分:1)
我认为这可能表明您做错了事。我宁愿专注于公共接口,而不是测试内部实现。如果这在公共接口中有所体现,则应该有一种方法可以通过公共接口或约定进行设置(例如从配置文件中读取)。
但是,如果您绝对需要这样做,可以考虑以下几点:
使用fabjan的答案
将此私有成员设为受保护成员,并创建派生的测试类。