1

所以我有一个疑问。这不是一个真正的问题,因为代码仍然有效,但看起来很草率。

我需要有两个构造函数。

public class JsonQuery
{
    const string currentWorkSheet = "GLHTanneryData_CurrentWeek";
    const string unitTestingWorkSheet = "GLHTanneryData_UnitTesting";
    private const string authorisation = "XXXX";
    JObject jObject;

    public JsonQuery()
    {
        SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
        jObject = JObject.Parse(smartsheetQuery.getJsonAsString(currentWorkSheet));
    }

    public JsonQuery(bool testing)
    {
        SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
        jObject = JObject.Parse(smartsheetQuery.getJsonAsString(unitTestingWorkSheet));
    }
}

每个都从 smartsheets 的不同位置获取一个 json 文件。因此,为了调用第二个构造函数,我只需为其提供一个布尔值 true。问题是,正如您从代码中看到的那样,我实际上不需要在方法中使用任何布尔值,我只需要知道这是我想要调用的构造函数。

有没有更好的方法来做到这一点?

4

5 回答 5

2

您可能会考虑的其他事情是设置用于测试的编译器指令

public JsonQuery()
{
    SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
#if TEST
    jObject = JObject.Parse(smartsheetQuery.getJsonAsString(unitTestingWorkSheet));
#else
    jObject = JObject.Parse(smartsheetQuery.getJsonAsString(currentWorkSheet));
#endif
}
于 2015-03-27T04:36:03.653 回答
2

看起来您的班级违反了单一职责原则,它既要确定数据又要解析数据。

在您的情况下,这个问题使得测试解析机制变得非常困难,因为它们在类中交织在一起。

另一种方法是让解析类依赖于某种数据提供者接口。

public interface ISmartSheetProvider
{
    string GetJsonData();
}

public class ProductionSmartSheetProvider : ISmartSheetProvider
{
    public string GetJsonData()
    {
        return new SmartsheetQuery().getJsonAsString("GLHTanneryData_CurrentWeek"));
    }
}

public class MockSmartSheetProvider : ISmartSheetProvider
{
    public string GetJsonData()
    {    
        return "..."; // whatever test data.
    }
}

public class JsonQuery(ISmartSheetProvider smartSheetProvider)
{
    jObject = jObject.Parse(smartSheetProvider.GetJsonData());
}

尽管由于所有工作都在构造函数中完成,但最好将其作为字符串提供或将整个类转换为静态方法。我假设这里省略了一些代码,并假设该类比提供的更多。

于 2015-03-27T05:13:04.513 回答
1

这样的事情会做吗:

public JsonQuery(bool testing = false)
{
    SmartsheetQuery smartsheetQuery = new SmartsheetQuery();

    if (testing)
         jObject = JObject.Parse(smartsheetQuery.getJsonAsString(unitTestingWorkSheet));
    else
         jObject = JObject.Parse(smartsheetQuery.getJsonAsString(currentWorkSheet));
}

然后对于非测试你只需要初始化new JsonQuery()

于 2015-03-27T04:27:33.360 回答
1

您实际上并不需要两个构造函数 - 看起来您会从传入工作表中受益:

 public JsonQuery(string worksheet)
 {
    SmartsheetQuery smartsheetQuery = new SmartsheetQuery();
    jObject = JObject.Parse(smartsheetQuery.getJsonAsString(worksheet));    
 }

只需传入不同的工作表进行测试。

于 2015-03-27T04:29:40.840 回答
0

它被称为构造函数链接或嵌套:

public JsonQuery() : this(false) // or true
{
}

public JsonQuery(bool testing) // or optional parameter value
{
    // use 'testing' here
}
于 2015-03-27T04:26:54.277 回答