我有以下類重複單元測試是否正常?
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