私は次のクラスを持っています
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 のテストも作成する必要があります (ほとんど同じテストになります)。