C# 类属性是只读的(测试重构)

C# 类属性是只读的(测试重构),c#,.net,ado.net,nunit,system-testing,C#,.net,Ado.net,Nunit,System Testing,我继承了测试服务于数据的API的代码。客户将预期结果作为SQL代码提供。测试代码有一个带有各种重载的实用程序类,用于将ADO.NET对象与API中的对象进行比较的VerifyResult。它看起来不太面向对象,所以我正在研究重构 下面是一些伪代码: [Test] public void Book() { DataRow expectedBook = myTestUtility.GetBookUsingSqlForIsbn("978-0304359387"); B

我继承了测试服务于数据的API的代码。客户将预期结果作为SQL代码提供。测试代码有一个带有各种重载的实用程序类,用于将ADO.NET对象与API中的对象进行比较的VerifyResult。它看起来不太面向对象,所以我正在研究重构

下面是一些伪代码:

[Test]
public void Book()
{
    DataRow expectedBook = 
        myTestUtility.GetBookUsingSqlForIsbn("978-0304359387");
    Book actualBook = API.GetBookForIsbn("978-0304359387");
    Assert.IsTrue(myTestUtility.VerifyResult(expectedBook, actualBook);
}
在测试实用程序类中:

protected bool VerifyResult(DataRow expectedBook, Book actualBook)
{
    Assert.AreEqual(expectedBook["ISBN"],  
                    actualBook.ISBN, 
                    "Book ISBN does not match");

    Assert.AreEqual(expectedBook["AuthorName"], 
                    actualBook.AuthorName, 
                    "Book AuthorName does not match");
    …
}
我在重构时的第一个想法是使用API对象中的值构造一个API对象(如Book),然后编写一个自定义的相等断言。然而,我并没有走多远:因为API只提供数据,它的类的属性是只读的(内部设置),所以我不能用自定义值创建Book对象(API是使用继承的所有具体类,没有接口)。有办法绕过这个限制吗

如果你能提出一个完全不同的方法,请放心


假设API类如下所示:

public class Point
{
    public int x { get; internal set; }
    public int y { get; internal set; }
}

public class Circle
{
    public int Radius { get; internal set; }
    public Point Pos { get; internal set; }
}

是否可以继承这些API类型并使属性可写,同时允许将API实例转换为新的子类型?

从实用程序类,您违反了基本单元测试准则。我的意思是,VerifyResult做的断言太多了,它总是混淆哪个断言失败以及为什么失败。所以把它分成两个不同的单元测试。这样总是清晰简洁的。有两种方法可以访问这些封闭类的属性/方法。一个是通过反射,另一个是使Book或API类中的那些封闭属性成为受保护的。然后添加您自己的类并从Book或API继承。然后,您可以公开一些方法或某些东西,并调用先前关闭的基类属性。@zenwalker:谢谢,我认为反射不起作用(有些属性是复杂类型),否则,我将尝试按照您的建议执行操作,并想知道如何从API类继承并使属性可写。假设您的API类具有属性SomeProperty{get;},现在您可以更改它并向其添加受保护集。然后,您可以使用自己的类继承该类进行测试,然后拥有一个公共方法或属性,您可以从中将值设置为基类属性。希望这个简单的小例子能帮助你@zenwalker:啊,我明白了。问题是,我无法更改API。这样做似乎违反了测试原则:“因为我们可能不再实际测试我们计划投入生产的代码。”