我有以下类重复单元测试是否正常?
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(这将是几乎相同的测试)
真正伟大的答案。这有很大帮助。 – user1520312
如果我要为GenerateKey和GenerateSecret使用一个函数。我会称这种功能是什么? GenerateKeyOrSecret? – user1520312
还有一个问题。如果您查看GenerateKey_keys_are_random,是否会破坏单元测试的规则必须是确定性的。由于一个以上的密钥可能相同,所以非常不可能。 – user1520312