c# - 修改私有(private)静态只读字段

标签 c# unit-testing

我有一个大型应用程序,它从配置文件中读取一些参数。

我正在为一个类编写单元测试,该类在使用参数和从配置文件读取的值执行某些操作后生成结果:

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_KEYPASSWORD_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/

相关文章:

python - 如何用 Nose 测试命令行脚本?

javascript - 开 Jest 模拟 aws-sdk ReferenceError : Cannot access before initialization

java - 如何在 TestNG 中动态更改 @Test 方法

c# - 实现抽象方法时更改参数类型

c# - 将字符串转换为结构的快速方法

c# - MS-Office 文档转换为 .PDF 格式

C# MongoDB 按日期分组(聚合)

xml - 规范用于 JUnit XML 输出

c++ - QT 测试 - 变量/对象失去值(value)

c# - 在引号中查找管道忽略误报