我继承了测试提供数据的 API 的代码。客户以 SQL 代码的形式提供预期结果。测试代码有一个实用程序类,其中包含用于将 ADO.NET 对象与 API 中的对象进行比较的 VerifyResult 的各种重载。它似乎不是很 OOP,所以我正在考虑重构。
这是一些伪代码:
[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 的实例转换为新的子类型?