gpt4 book ai didi

c# - 重复单元测试可以吗?

转载 作者:太空宇宙 更新时间:2023-11-03 11:09:52 24 4
gpt4 key购买 nike

我有以下类(class)

public interface IAuthProvider
{
string GenerateKey();
}

public class AuthProvider : IAuthProvider
{
public string GenerateKey()
{
using (var rng = new RNGCryptoServiceProvider())
{
var data = new byte[16];
rng.GetBytes(data);
return BitConverter.ToString(data).Replace("-","");
}
}
}

我还进行了后续单元测试

[TestClass]
public class AuthProviderTests
{
private AuthProvider _provider;
private string _key;

[TestInitialize]
public void Initialize()
{
_provider = new AuthProvider();
_key = _provider.GenerateKey();
}

[TestMethod]
public void GenerateKey_key_length_is_32_characters()
{
Assert.AreEqual(32, _key.Length);
}

[TestMethod]
public void GenerateKey_key_is_valid_uppercase_hexidecimal_string()
{
Assert.IsTrue(_key.All(c =>
(c >= '0' && c <= '9') ||
(c >= 'A' && c <= 'F')
));
}

[TestMethod]
public void GenerateKey_keys_are_random()
{
var keys = new List<string>
{
_provider.GenerateKey(),
_provider.GenerateKey(),
_provider.GenerateKey(),
_provider.GenerateKey(),
_provider.GenerateKey()
};

var distinctCount = keys.Distinct().Count();

Assert.AreEqual(5, distinctCount);
}
}

一切正常。但是,我需要创建一个名为 GenerateSecret 的方法(并对其进行测试)。此方法与 GenerateKey() 的作用完全相同。

现在我想我应该创建一个名为 GenerateRandomHexString(int bytes) 的方法并将代码从 GenerateKey 复制到其中。然后对于 GenerateKey 和 GenerateSecret 我应该使用以下代码:

public interface IAuthProvider
{
string GenerateKey();
string GenerateSecret();
string GenerateRandomHexString(int bytes);
}

public class AuthProvider : IAuthProvider
{
public string GenerateKey()
{
return GenerateRandomHexString(16);
}

public string GenerateSecret()
{
return GenerateRandomHexString(16);
}

public string GenerateRandomHexString(int bytes)
{
using (var rng = new RNGCryptoServiceProvider())
{
var data = new byte[bytes];
rng.GetBytes(data);
return BitConverter.ToString(data).Replace("-","");
}
}
}

现在进行测试,我应该只为 GenerateRandomHexString 方法编写测试,还是应该为 GenerateSecret 和 GenerateKey 编写测试(这将是几乎相同的测试)

最佳答案

为什么需要两个方法做同样的事情?

无论如何,您应该编写单独的测试。

  • 通常单元测试应该覆盖公共(public)接口(interface)而不是非公共(public)成员,如果您的 GenerateHexString 仅供其他方法使用,则它可能不应该是公共(public)的
  • 您的实现方式现在相同,但将来可能会有所不同。如果没有不同的测试用例,您可能会错过由更改其中一个实现的人引入的重大更改
  • 最终,您的测试不应该知道或关心代码的内部实现细节

可能对 nUnit 有帮助的一件事是 TestCaseSource 属性。它将允许您为两种方法定义相同的测试用例,从而节省代码中的一些重复。

关于c# - 重复单元测试可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14449817/

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