N单元测试调试器没有步入静态方法

时间:2017-04-26 08:53:19

标签: c# unit-testing nunit

我的单位测试方法如下

[Test]
public void TrackPublicationChangesOnCDSTest()
{
    //Arrange
    // objDiskDeliveryBO = new DiskDeliveryBO();            

    //Act
    var actualResult = objDiskDeliveryBO.TrackPublicationChangesOnCDS();

    //Assert 
    var expectedZipName = 0;
    Assert.AreEqual(expectedZipName, actualResult);
}

BO中的实际方法TrackPublicationChangesOnCDS如下

public int TrackPublicationChangesOnCDS()
{

    var resultFlag = -1;

    try
    {

        string pubUpdateFileCDSPath = CommonCalls.PubUpdateFileCDSPath;
        string pubUpdateFileLocalPath = CommonCalls.PubUpdateFileLocalPath;


        if (File.Exists(pubUpdateFileCDSPath))
            File.Copy(pubUpdateFileCDSPath, pubUpdateFileLocalPath, true);

        if (File.Exists(pubUpdateFileLocalPath))
        {

            string[] pubRecords = File.ReadAllLines(pubUpdateFileLocalPath);

            var pubRecordsExceptToday = pubRecords.Where(p => !p.Trim().EndsWith(DateTime.Now.ToString("dd/MM/yy"))).ToList();

            resultFlag = new DiskDeliveryDAO().TrackPublicationChangesOnCDS(pubRecordsExceptToday);

            File.WriteAllText(pubUpdateFileLocalPath, string.Empty);

            string[] pubRecordsCDS = File.ReadAllLines(pubUpdateFileCDSPath);
            var pubRecordsTodayCDS = pubRecordsCDS.Where(p => p.Trim().EndsWith(DateTime.Now.ToString("dd/MM/yy"))).ToList();
            File.WriteAllLines(pubUpdateFileCDSPath, pubRecordsTodayCDS);

        }

        return resultFlag;
    }
    catch (Exception)
    {

        return -1;
    }

}

调试Debugger时直到 string pubUpdateFileCDSPath = CommonCalls.PubUpdateFileCDSPath;

但是CommonCalls.PubUpdateFileCDSPath;返回空字符串。它应该返回一个文件路径。当直接调用该方法时,它工作正常。在单元测试方法中调用它时不起作用。

CommonCalls.PubUpdateFileCDSPath是一个静态属性,定义如下。

public static string PubUpdateFileCDSPath
{
    get { return GetXmlConfigValue("PubUpdateFileCDSPath"); }
}

public static string GetXmlConfigValue(string nodeName)
{
    var xml = new XmlDocument();
    xml.Load(ConfigValuesXml);
    var node = xml.SelectSingleNode("JanesOfflineDeliveryService/" + nodeName);
    return node != null ? node.InnerText : string.Empty;
}

Configvaluesxml是一个xml文件路径。该文件的内容是

  
<JanesOfflineDeliveryService> 
  <PubUpdateFileCDSPath>D:\OfflineDelivery\CDS\pub_update.txt</PubUpdateFileCDSPath>
  <PubUpdateFileLocalPath>D:\pub_update.txt</PubUpdateFileLocalPath>
</JanesOfflineDeliveryService>

2 个答案:

答案 0 :(得分:0)

在测试场景中,GetXmlConfigValue(“PubUpdateFileCDSPath”)不存在,因此返回字符串为空。这就是为什么你应该避免静态方法,因为它们不可模仿。解决方法可能是将路径变量传递给方法。

答案 1 :(得分:0)

使用静态依赖关系使单元测试代码难以实现。通过抽象并将它们注入依赖类来反转依赖。

public interface ICommonCalls {
    string PubUpdateFileCDSPath { get; }
    string PubUpdateFileLocalPath  { get; }
}

上述接口的实现要么包装静态调用,要么更好地实现它们。

依赖类将被重构以允许依赖性反转。

public class DiskDeliveryBO {
    private readonly ICommonCalls CommonCalls;


    public DiskDeliveryBO(ICommonCalls common) {
        this.CommonCalls = common;
    }

    //...other code removed for brevity.
}

然而,目标方法也与文件系统等实现问题有很多紧密耦合。这也应该从依赖类中抽象出来并反转出来。