如何对每次调用时创建新公钥和私钥的控制器进行单元测试?

时间:2017-03-17 19:11:28

标签: c# asp.net unit-testing licensing

我的老板要我为我们的ASP.NET应用程序单元测试此许可证控制器。

我遇到的问题通常是这样 你转到应用程序创建一个许可证,许可证绑定到密钥生成器的当前实例和密钥对(来自portable = license库)我有一个名为LicenseService的静态类,它在调用时创建密钥生成器和密钥对。因此,您生成许可证,然后转到验证页面,该页面位于密钥生成器和密钥对的同一实例上。因此验证将通过,如果许可证是在另一个实例上创建的,它将不会验证(不同的公钥/私钥)可能的解决方法是什么?

因为Im单元测试有效的许可证和无效的许可证所以我需要预先创建许可证,但每个许可证都绑定到一个唯一的实例,因此将使用不同密钥对创建的许可证传递给另一个实例(具有自己的密钥对)将无效(即使许可证本身无效)。

这是我的一些想法

  1. 对密钥进行硬编码(我在本地进行测试所以它不应该是一个太大的问题)但我觉得这有一个安全漏洞

  2. 以某种方式强制控制器和控制器的所有后续实例使用生成器的一个特定实例,同时拥有多个密钥对(这似乎非常困难,我不确定如何处理它)

    < / LI>

    这是图书馆btw

    http://dev.nauck-it.de/projects/portable-licensing/wiki/GettingStarted

1 个答案:

答案 0 :(得分:0)

代码会很好,但没有它。

如果此许可证生成器是您的类,那么

  1.  don't make you LicenseService static.  
  2.  have this LicenseService inherit from an interface.  define the interface with whatever the public methods of the current
service are.
  3.  pass the interface to the constructor of your controller
  4.  use IoC to pass an instance of the class that implements the interface or create a new constructor that instantiates the class
for the constructor

如果您无法修改许可证生成器类。

  1.  define the interface with whatever the public methods of the current
service are. 
  2.  create a wrapper class that passes through to the static methods
  3.  pass the interface to the constructor of your controller
  4.  use IoC to pass an instance of the class that implements the interface or create a new constructor that instantiates the class
for the constructor

一些抛出代码

public interface IGenerateLicenseKeys
{
    SomeType GenerateKeys();
}

public class LicenseKeyGenerator : IGenerateLicenseKeys
{
    public SomeType GenerateKeys()
    {
        //Generate your keys or  pass through to the other component with the static method. 
        throw new NotImplementedException();                         
    }
}

完成后,模拟LicenseKeyGenerator并从模拟方法中返回您想要的任何值。