如何使用XDocument.Load()测试方法

时间:2018-03-29 11:57:27

标签: c# unit-testing

我有以下代码:

Dim r As Long
Dim c As Long
' 21 targets column U 
c = 21

For r = 4 To 50
If Cells(r, c).Value = "Yes" Then
'here I think the process would be to unprotect the sheet, then select from (r,c+1) to (r,c+17), apply the formatting (shade and protection), go to next r and at the end protect the sheet again

如何测试此方法?我想查看三个案例: - 正确的XML - XML不正确 - 不是XML(例如路径中的.bmp文件) 我正在使用Visual Studio测试。

2 个答案:

答案 0 :(得分:0)

使用[DeploymentItem]属性运行测试时,可以部署其他文件。它们将被复制到TestContext.TestDeploymentDir

// assume this XML file is in the root of the test project, 
// and "Copy to Output Directory" property of the file is set to "Copy always"
const string ValidXmlFileName = "valid.xml"; 

[TestMethod]
[DeploymentItem(ValidXmlFileName)]
public void Validate_ValidXml_ShouldBeOk() {

    string path = Path.Combine(TestContext.TestDeploymentDir, ValidXmlFileName);

    // perform test with the deployed file ...
}

进一步阅读:How to: Deploy Files for Tests

答案 1 :(得分:0)

此代码与静态实现问题紧密相关,如果标题和问题让我相信这是XY problem

要解决此代码的缺点,需要对其进行重构,以将其与实现问题分离。

文档的实际加载和验证可以委托给他们自己关注的问题,如以下示例所示

public interface IDocumentLoader<T> where T : class {
    T Load(string path);
}

public interface IXDocumentLoader : IDocumentLoader<XDocument> { }
public class XDocumentLoader : IXDocumentLoader {
    public XDocument Load(string path) {
        return XDocument.Load(path);
    }
}

public interface IDocumentValidator<T> where T : class {
    void Validate(T document);
}

public interface IXDocumentValidator : IDocumentValidator<XDocument> { }
public class XDocumentValidator : IXDocumentValidator {
    public void Validate(XDocument document) {
        XmlSchemaSet schema = new XmlSchemaSet();
        schema.Add("", XmlReader.Create(new StringReader("XsdFile")));
        document.Validate(schema, null);
    }
}

public class Subject {
    private IXDocumentLoader loader;
    private IXDocumentValidator validator;

    public Subject(IXDocumentLoader loader, IXDocumentValidator validator) {
        this.loader = loader;
        this.validator = validator;
    }

    public void Foo(string path) {
        try {
            XDocument document = loader.Load(path);
            validator.Validate(document);
            //Some logic
        } catch (Exception ex) {
            //Some logic
        }
    }
}

原始示例中提供的大部分登录信息都是委派出来的。这样可以单独测试每个方面而不会产生副作用,甚至需要从磁盘加载实际的XDocument,如果需要的话。

可以仅使用为该测试提供的必要依赖项来测试给定方案。这可用于测试异常被捕获,或者在原始问题中省略的逻辑中的其他内容。

在设计代码时使用SOLID方法可以更容易维护,包括单元测试。