gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:22:45 24 4
gpt4 key购买 nike

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

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com