gpt4 book ai didi

c# - 在抽象通用测试类中定义单元测试

转载 作者:行者123 更新时间:2023-11-30 18:03:55 30 4
gpt4 key购买 nike

是否可以为 Visual Studio 2008 中的单元测试提供通用抽象基测试类?

如果基类抽象测试类不是泛型,则其所有标有[TestMethod] 的基类方法都将在派生类中正确继承并在 Visual Studio 中执行。如果基类是泛型,则 Visual Studio 不会在派生类中执行这些方法。

假设您有一堆实现此接口(interface)(简化)的解析器类:

// parses the input stream into an 
// instance of T
interface IParser<T>
{
IParserResult<T> Parse(byte[] input);
}

假设你有一堆可以解析特定流的解析器:

class HeaderParser : IParser<T> { ... }
class SomeOtherParser : IParser<T> { ... }
... many more ...

为了测试每个解析器的功能,可以将常见的测试模式提取到这样的抽象类中:

[TestClass]
abstract class ParserTest<T>
{
[TestMethod]
public void TestParser()
{
// 1. init parser
var parser = new T();

// 2. get data
var input = GetInputData();

// 3. parse
var result = parser.Parse(input);

// 4. make common assertions
Assert.AreEqual(ParserResultType.Success, result.Type);
Assert.AreEqual(input.Length, result.NextDataOffset);

// 5. specific validation
Validate(result.Value);
}

protected abstract byte[] GetInputData();

protected abstract void Validate(T result);
}

如果此类是通用的和抽象的,则 TestParser 方法将不会作为派生类的单元测试执行。

最佳答案

好吧,我采用了一种不同的方法,类似于@stijn 刚才建议的方法。

我完全删除了抽象基类,并创建了一个从实际解析器测试中调用的辅助类。这是一个更好的解决方案,因为它允许在每个派生类中重复使用具有不同参数组合和验证方法的相同方法(而抽象类只有一对 CreateData/TestResults 抽象方法)。

public class ParserTestHelper
{
public static void Test<T>(
Func<IParser<T>> getParser,
Func<byte[]> getInput,
Action<T> checkResult)
{
// get parser
var parser = getParser();

// get input data
var input = getInput();

// parse
var result = parser.Parse(input, 0);

// common assertions
Assert.AreEqual(ParserResultType.Success, result.ResultType);
Assert.AreEqual(input.Length, result.NextDataOffset);

// validate results
checkResult(result.ParsedValue);
}
}

派生类现在可以简单地调用实际测试方法中的方法:

[TestClass]
public class HeaderParserTest
{
[TestMethod]
public void TestHeader()
{
ParserTestHelper.Test(
() => new HeaderParser(),
() => /* generate data */,
() => /* validate results */);
}
}

谢谢大家!

关于c# - 在抽象通用测试类中定义单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6704172/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com