gpt4 book ai didi

c# - 我应该为参数异常编写测试吗?

转载 作者:行者123 更新时间:2023-11-30 15:06:47 25 4
gpt4 key购买 nike

在应用 TDD 时,您是创建测试来验证参数的预期异常(ArgumentException、ArgumentNullException、InvalidOperation 等)还是仅“已知”异常,例如 CustomerDelinquentException?

equals、gethashcode overrides 怎么样?我将如何测试 gethashcode?

谢谢

最佳答案

我总是测试我在我的方法中抛出的任何异常,包括 ArgumentNullExceptionArgumentException 等。我发现最好测试这些,它们很容易写。这样一来,如果有人移除那些守卫,测试就会中断,你就会知道。

    [TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void ToSetOnNullThrows()
{
List<string> list = null;
var target = list.ToHashSet();
}

至于 GetHashCode()Equals() 我也测试了它们如果你覆盖它们。对于 GetHashCode(),一个简单的测试是创建两个等效对象(哈希码中使用相同的值)并证明两个对象生成的哈希码相同。

    [TestMethod]
public void GetHashCodeSameKeysAreSameTest()
{
var key = new CompositeKey<string, int>("A", 13);
var otherKey = new CompositeKey<string, int>("A", 13);

Assert.AreEqual(key.GetHashCode(), otherKey.GetHashCode());
}

您可以尝试测试两个不等价的对象是否返回不同的散列码,但您必须确保您使用的值不仅仅是冲突。这在很大程度上取决于您在 GetHashCode() 中编写的算法。

    [TestMethod]
public void GetHashCodeDifferentKeysAreMostLikelyDifferentTest()
{
var key = new CompositeKey<string, int>("A", 13);
var otherKey = new CompositeKey<string, int>("A", 14);

Assert.AreNotEqual(key.GetHashCode(), otherKey.GetHashCode());
}

对于 Equals() 测试两个具有相同字段的等效对象在 Equals() 上返回 true 并在两个非等效上返回 false对象。

    [TestMethod]
public void EqualsTest()
{
var key = new CompositeKey<string, int>("A", 13);
var otherKey = new CompositeKey<string, int>("A", 13);

Assert.IsTrue(key.Equals(otherKey));
}

[TestMethod]
public void NotEqualsTest()
{
var key = new CompositeKey<string, int>("A", 13);
var otherKey = new CompositeKey<string, int>("A", 15);

Assert.IsFalse(key.Equals(otherKey));
}

为了更有趣,我也喜欢对 DateTime 相关的东西进行单元测试。这有点难,但是如果方法的行为取决于 DateTime 我仍然想对它们进行单元测试。因此,您可以创建一个默认返回 DateTime.NowDateTime 生成器委托(delegate),但拥有它以便您可以将生成器设置为特定的 DateTime .由于我在金融行业,很多逻辑都取决于上市前、上市后的时间等,这对我的工作范围有很大帮助...

public class SomeClassThatDependsOnCurrentTime
{
internal Func<DateTime> NowGenerator { get; set; }

public SomeClassThatDependsOnCurrentTime()
{
// default in constructor to return DateTime.Now
NowGenerator = () => DateTime.Now;
}

public bool IsAfterMarketClose()
{
// call the generator instead of DateTime.Now directly...
return NowGenerator().TimeOfDay > new TimeSpan(16, 0, 0);
}
}

然后您只需设置单元测试以注入(inject)特定的日期时间。

关于c# - 我应该为参数异常编写测试吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7284194/

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