gpt4 book ai didi

c# - 如何正确测试抽象类

转载 作者:太空狗 更新时间:2023-10-29 22:16:26 26 4
gpt4 key购买 nike

我目前正在为名为 Component 的抽象类创建单元测试。 VS2008 编译我的程序没有问题,所以我能够在解决方案中创建一个单元测试项目。不过,我注意到的一件事是,在创建测试文件后,有这些我以前从未见过的方法:

internal virtual Component CreateComponent()
{
// TODO: Instantiate an appropriate concrete class.
Component target = null;
return target;
}


internal virtual Component_Accessor CreateComponent_Accessor()
{
// TODO: Instantiate an appropriate concrete class.
Component_Accessor target = null;
return target;
}

我假设这些是为了创建一个具体的 Component 类。

在每个测试方法中,都有这一行:

组件目标 = CreateComponent();//TODO:初始化为适当的值

如何将其初始化为适当的值?或者,如何实例化一个适当的具体类,如上面所述,通过 CreateComponentCreateComponent_Accessor 方法?

这里是抽象类的构造函数,更多信息:

protected 组件(eVtCompId inComponentId,eLayer inLayerId,IF_SystemMessageHandler inMessageHandler)

最佳答案

您不能实例化抽象类。因此,您可以在单元测试项目中编写此抽象类的模拟实现(您应该在其中实现抽象成员),然后调用您要测试的方法。您可以使用不同的模拟实现来测试类的各种方法。

作为编写模拟实现的替代方法,您可以使用模拟框架,例如 Rhino Mocks、Moq、NSubstitute 等,这可以简化此任务并允许您为类的抽象成员定义期望。


更新:

根据评论部分的要求,这里有一个例子。

假设您有以下要进行单元测试的抽象类:

public abstract class FooBar
{
public abstract string Foo { get; }

public string GetTheFoo()
{
return "Here's the foo " + Foo;
}
}

现在在您的单元测试项目中,您可以通过编写一个派生类来实现它,该派生类使用模拟值实现抽象成员:

public class FooBarMock : FooBar
{
public override string Foo
{
get { return "bar" }
}
}

然后您可以针对 GetTheFoo 方法编写单元测试:

// arrange
var sut = new FooBarMock();

// act
var actual = sut.GetTheFoo();

// assert
Assert.AreEqual("Here's the foo bar", actual);

使用模拟框架(在我的例子中是 Moq),你不需要在单元测试中实现这个抽象类,但你可以直接使用模拟框架来定义被测方法所依赖的抽象成员的期望:

// arrange
var sut = new Mock<FooBar>();
sut.Setup(x => x.Foo).Returns("bar");

// act
var actual = sut.Object.GetTheFoo();

// assert
Assert.AreEqual("Here's the foo bar", actual);

关于c# - 如何正确测试抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15197141/

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