如何与NUnit同时声明多个变量?

问题描述 投票:0回答:2

这应该是可能的,而且我认为使用约束可能是可能的,但是它们似乎只接受一个变量作为输入,但失败了。

这是我遇到的最简单的例子:

  1. 我有一个具有大小的对象(即2D变量)
  2. 我需要显示部分在屏幕外
  3. 如果x超出范围或y超出范围,则会发生这种情况
  4. ...我看不到如何在NUnit中实现这一目标(不丢掉关键信息)

看来NUnit根本不支持一维问题以外的任何东西,这将是荒谬的,因此我在这里必定会遗漏一些东西。但是我能找到的唯一方法仅适用于一维输入。

我已经想到的……但是不起作用:

i。 Assert.True( A | B )-没用:它会丢弃所有“预期”信息并生成如此微弱的消息,因此在这里使用测试框架基本上没有意义。

ii。 Assert.Or-不允许多个变量,因此可以测试“ X是3或4或5”,但是不能测试“ X是3或Y是4”]

iii。为Tuple<A,B>编写自定义断言-但是,当您获得“大于” ...的错误时,这将是非常错误的……“ <A,B>大于<C,D>”是一个不重要的问题,最终会产生大量的代码令人困惑,我可以保证将来有人会误解和错误使用它(可能是我:))

c# nunit
2个回答
1
投票

一维问题

坦率地说,我不太了解。如果考虑到这一点,实际上Assert中的all成员是解决布尔问题(零维)的工具。在所有断言的情况下,提高红色或绿色标志是很有意义的。

您的问题也是一个是/否的问题:“我的物体在屏幕外吗?”。

i。 Assert.True( A | B )-无用:它会丢弃所有“预期”信息并生成此类弱消息

什么都不会阻止您指定消息,如果断言失败,则会显示该消息:

Assert.IsTrue(myObject.IsOnScreen(), $"Object is off-screen: {myObject.Bounds}")

但是在这种情况下,您可以轻松地将其转换为等价断言:

// here also the default message may be clear enough
Assert.AreEqual(expected: screenBounds, actual: screenBounds.UnionWith(myObject.Bounds));

瞧,一次比较了多个(四个)属性...


0
投票

老实说,您在解释所需内容方面做得并不出色。我重读了几次,我想我猜对了,但是我不必这样做,请尝试编码下一个问题。

我想您希望可以在NUnit约束表达式的过程中更改实际值...类似这样...

// NOT WORKING CODE
Assert.That(X, Is.OnScreen.And.That(Y, Is.OnScreen));

((“屏幕”用于进行您需要的测试)

但是您不能那样做。要使用NUnit的现有功能,每个断言都需要处理一个实际值。

我能想到的最简单的方法是使用多个断言:

Assert.Multiple(() =>
{
    Assert.That(X.IsOnScreen);
    Assert.That(Y.IsOnScreen);
});

我说这很简单,因为NUnit已经做到了。但是,它的表现力不是很好。

如果您要进行许多这样的测试,最简单的事情就是创建一个自定义约束,该约束将您的对象作为一个实体来处理。然后,您将可以编写如下内容:

Assert.That(myObject, Is.OnScreen);

不仅是伪代码,而且是实际代码。基本上,您将在矩形上创建一组测试,一方面代表对象边界,另一方面代表屏幕尺寸。

© www.soinside.com 2019 - 2024. All rights reserved.