我有一个大型应用程序,它从配置文件中读取一些参数。
我正在为一个类编写单元测试,该类在使用参数和从配置文件读取的值执行某些操作后生成结果:
internal static class Password
{
private static readonly byte PASSWORD_PRIVATE_KEY
= ConfigFile.ReadByte("PASSWORD_PRIVATE_KEY");
public static byte Generate(byte passwordPublicKey);
}
在我的单元测试中,我知道 Password.Generate()
方法应该为给定的 PASSWORD_PRIVATE_KEY
和 PASSWORD_PUBLIC_KEY
返回值。但我希望 PASSWORD_PRIVATE_KEY
值曾经在单元测试类中定义,而不是在配置文件中定义:
[TestMethod]
public void PasswordGenerate_CalculatedProperly()
{
byte passwordPublicKey = 0x22;
Password_Accessor.PASSWORD_PRIVATE_KEY = 0xF0;
byte expectedGenerated = 0xAA;
byte generated = Password_Accessor.Generate(passwordPublicKey);
Assert.AreEqual(expectedGenerated, generated);
}
有没有一种方法可以通过代码编写private static readonly
,这样我的测试就不必依赖任何配置文件?
最佳答案
要以干净的方式做到这一点,您需要制作 Password
更可测试。为此,请考虑以下设计:
internal static class Password
{
public static void Configure(IPrivateKeyProvider keyProvider)
{
keyProvider = keyProvider;
}
public static byte Generate(byte passwordPublicKey); // use keyProvider
private static IPrivateKeyProvider* keyProvider;
}
internal interface IPrivateKeyProvider
{
byte GetPrivateKey();
}
internal class ConfigPrivateKeyProvider : IPrivateKeyProvider
{
private static readonly byte PASSWORD_PRIVATE_KEY
= ConfigFile.ReadByte("PASSWORD_PRIVATE_KEY");
public byte GetPrivateKey()
{
return PASSWORD_PRIVATE_KEY;
}
}
internal class PrivateKeyProviderStub : IPrivateKeyProvider
{
public PrivateKeyProviderStub(byte privateKey)
{
this.privateKey = privateKey;
}
public byte GetPrivateKey()
{
return this.privateKey;
}
}
现在您的生产代码可以使用 ConfigPrivateKeyProvider
和测试可以使用 PrivateKeyProviderStub
.
保留Password
有点简化作为静态类。我建议也将其重构为一个普通类,如果合适的话也可以是一个单例类。
另请注意,有许多测试框架可以方便地即时生成模拟和 stub (例如 Rhino Mocks),因此无需手动实现 PrivateKeyProviderStub
.
关于c# - 修改私有(private)静态只读字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19229671/