gpt4 book ai didi

c# - NUnit 是否在每次测试之间重新实例化标记为 TestFixtures 的类?

转载 作者:行者123 更新时间:2023-11-30 20:31:20 27 4
gpt4 key购买 nike

我有一个 TestFixture 标记的类,它正在对名为“HideCurrentTitleBarMessageTask”的类的功能进行单元测试。

在这个类中,我使用替代方法在 [Setup] 方法中模拟一个接口(interface),并且在测试类的一些测试中,我设置了一个来自该模拟接口(interface)成员的返回结果。

[TestFixture]
public class TestClass_A {

private ITitleBarMessageModel model;
private ITitleBarMessage message;
private HideCurrentTitleBarMessageTask task;
private bool taskCompleteFired;


[SetUp]
public void SetUp() {
taskCompleteFired = false;
model = Substitute.For<ITitleBarMessageModel>();
message = Substitute.For<ITitleBarMessage>();
//model.currentlyDisplayedMessage = null;
task = new HideCurrentTitleBarMessageTask();
task.Init(model);
task.Completed += (t) => { taskCompleteFired = true; };
}

[Test]
public void Test_A() {
task.Execute();
Assert.That(taskCompleteFired, Is.True);
}

[Test]
public void Test_B() {
model.currentlyDisplayedMessage.Returns(message);
task.Execute();
message.Received(1).Hide();
Assert.That(taskCompleteFired, Is.False);
}
}

HideCurrentTitleBarMessageTask 的执行函数如下所示

public override void Execute() {
if (model.currentlyDisplayedMessage != null) {
//Some irrelevant stuff
} else {
Completed(this);
}
}

请注意,只有在 Test_B 中,我才使用 model.currentlyDisplayedMessage 设置返回值。

如果我在 Test_A 的第 1 行设置断点,我会在调试器中看到 model.currentlyDisplayedMessage 不为空,但实际上已分配。在不应该的时候。尽管据推测,方法 SetUp 之前被调用过,并且该行

model = Substitute.For<ITitleBarMessageModel>();

被执行,有效地将一个新的模拟实例重新分配给模型。这会导致 Test_A 失败。

现在,注意注释掉的行

//model.curentlyDisplayedMessage = null;

在 SetUp 方法中。取消注释,通过将模型中的引用显式设置为 null 来解决问题。 (我还假设在 [TearDown] 标记的方法中可以实现相同的结果)。

NUnit 不会清除 TestClass 并在测试之间从头开始吗?

如果没有,谁能告诉我为什么要调用

model = Substitute.For<ITitleBarMessageModel>();

在 SetUp() 方法中没有为我提供一个干净的模型模拟实例来开始我的测试?

最佳答案

不,NUnit 不会为每个测试用例创建一个新的夹具类实例。创建单个实例,然后将其重新用于每个测试。这与其他一些测试框架不同,但它一直是 NUnit 的工作方式(自 2000 年以来)。

这意味着您必须谨慎使用对象状态。1、尽量少用state。2. 使用SetUp 进行初始化,使用TearDown 进行清理。

根据@David 的评论...NSubstitute 将自动替换返回接口(interface)的成员。请参阅递归模拟。我认为这解释了为什么 model.currentlyDisplayedMessage 是为新替换的模型初始化的。

关于c# - NUnit 是否在每次测试之间重新实例化标记为 TestFixtures 的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43349775/

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