Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对两个不同的类应用一个测试_C#_Java_Unit Testing_Design Patterns_Junit - Fatal编程技术网

C# 对两个不同的类应用一个测试

C# 对两个不同的类应用一个测试,c#,java,unit-testing,design-patterns,junit,C#,Java,Unit Testing,Design Patterns,Junit,我有两个不同的类,它们共享一个公共接口。尽管功能相同,但它们在内部的工作方式却截然不同。所以很自然我想测试他们两个 我能想出的最好的例子;我 将某物序列化为文件,一个 类将其序列化为纯文本 另一种是xml。数据(应该)看起来 在考试前后都一样 不考虑方法的序列化 用过 以相同的方式测试两个类的最佳方法是什么?这些测试只是在实例化不同类的方式上有所不同。我不想复制整个测试,重命名它并更改一行 测试目前在JUnit中,但无论如何我都会将它们移植到NUnit,这样代码就不重要了。我正在寻找一种设计模式

我有两个不同的类,它们共享一个公共接口。尽管功能相同,但它们在内部的工作方式却截然不同。所以很自然我想测试他们两个

我能想出的最好的例子;我 将某物序列化为文件,一个 类将其序列化为纯文本 另一种是xml。数据(应该)看起来 在考试前后都一样 不考虑方法的序列化 用过

以相同的方式测试两个类的最佳方法是什么?这些测试只是在实例化不同类的方式上有所不同。我不想复制整个测试,重命名它并更改一行


测试目前在JUnit中,但无论如何我都会将它们移植到NUnit,这样代码就不重要了。我正在寻找一种设计模式来应用于这个测试套件

为测试创建公共抽象基类

abstract class BaseTest{

 @Test
 public void featureX(){
    Type t = createInstance();
    // do something with t
 }

 abstract Type createInstance();
}

ConcreteTest extends BaseTest{

    Type createInstace(){
        return //instantiate concrete type here.
    }
}

我将通过继承或聚合重用代码

为了获得最短的代码,我将测试实例创建移动到例如XmlImplementationTest类中的工厂方法,并从中继承TextImplementationTest:

XmlImplementationTest extends TestCase
{
  Interface tested = null
  Interface createTested() { return new XmlImplementation() }
  ...
  void setUp() { tested = createTested(); }
}

TextImplementationTest extends XmlImplementationTest
{
  override Interface createTested() { return new TextImplementation() }
}
这不是完全正确的OO设计,因为它的
TextImplementationTest
不是
XmlImplementationTest
。但通常你不需要关心它

或者将测试方法调用重新格式化为某个公共实用程序类。这将涉及更多的代码,并且不会在测试报告中显示正确的测试类,但可能更容易调试。

在C#中,我会使用一个通用的助手方法来测试这两种情况,类似于:

internal static void SerializationTestHelper<T>() where T : IMySerialize
{
    T serialize = new T();
    // do some testing
}

[TestMethod]
public void XmlTest()
{
    SerializationTestHelper<XmlSerialize>();
}

[TestMethod]
public void PlainTextTest()
{
    SerializationTestHelper<PlainTextSerialize>();
}
内部静态void SerializationTestHelper(),其中T:IMySerialize
{
T serialize=newt();
//做一些测试
}
[测试方法]
公共测试
{
SerializationTestHelper();
}
[测试方法]
公共无效明文测试()
{
SerializationTestHelper();
}

我倾向于避免测试类之间的任何关系。我喜欢让测试用例(或类)尽可能原子化。在这里使用继承的好处并不超过它所带来的强耦合

我想如果你能分享这两个类的结果的验证(假设黑盒测试),这会很有帮助。如果这两个类都可以让您设置outputstream,那么您可以在类本身写入PrintWriter或FileWriter(或您案例中需要的任何内容)时验证它


此外,我会避免在单元测试期间创建文件,因为这可能会花费太多时间(+它可能无法在构建机器上工作),因此会延迟构建。

好选项,但您还需要将
BaseTest
标记为忽略,以便xUnit不会尝试运行它。具体取决于运行程序。有多少聪明的人。前者认为类是抽象的,而后者可以配置为根据模式忽略类。确实非常有效的点,但将它们完全分开意味着大约1000行(接近)相同的代码。当需要更新两个测试时,更改接口或其工作方式似乎有点像一罐蠕虫。但也许你是对的,也许这是你用相似的逻辑写两门课时得到的结果。你在写测试之前写了这些课,也许这给了你一个教训