【问题标题】:Roslyn Usage for method rewrite and executionRoslyn 用于方法重写和执行的用法
【发布时间】:2016-01-20 06:49:51
【问题描述】:

我有一个类和方法,即。 -

public class Class1
{
  public void SomeMethod(int x, int y)
  {
     using(var scope = new TransactionScope())
     {
       if(x == 0 && y == 0)
       {
          //Do Something
       }
       if(x ==1)
       {
         //Do something
       }

       // Need to throw an exception for running a test case to check   
       // rollback scenario            

       if(y == 2)
       {
          //Do something
       }
       scope.Complete();
     }
  }
}

我想测试事务范围回滚的东西,所以我想在上面的代码之间注入一个异常(即想用throw new Exception("some message")) 并运行内存中重新编译的方法以测试代码执行之间是否出现问题,然后将回滚。我不想更改现有代码中的任何内容用于测试回滚场景。

无论我读到什么关于 Roslyn 的内容(我对这个 .NET 领域非常陌生),我认为可以使用一些 Roslyn API 来完成。但是我不确定该怎么做,因为我不太熟悉。如果有人可以提供一些基于示例的建议,那将非常有帮助。

【问题讨论】:

  • 我会注入一个抛出的Do something。但我会使用正常的 DI 实践。
  • 顺便说一句,“Roslyn”是 .NET(Visual C# 和 Visual Basic)的新编译器平台,仅适用于源代码文本。没有办法重新编译。它只是编译!
  • @PauloMorgado:对我来说,为了一个单一的测试目的而注入一些东西(可能是一些 Action 方法对象)似乎是一种开销,并且还需要在代码中调用该操作,这将是实际上在生产代码中没有用。如果我提供 Roslyn API 的相对文件路径,是否可以达到上述目的?我已经准备好一起创建一个新文件了,遵循 Open Closed 原则应该没问题。
  • DI 可以像委托一样简单,但可以更深入。它有利于可测试性,这正是您所寻找的。尽管如此,为了给你指明你想要的方向,Jash Varty 在his blog 上发布了一系列关于使用“Roslyn”的博文。
  • @sandipray 如果您担心会影响生产代码,请将该代码放入预编译器检查,以便仅在测试时编译。我想你正在尝试做的事情将变得足够困难,以至于你搞砸如何测试它的可能性大于你搞砸正在测试的实际方法。如果测试中的错误概率高于被测试事物的错误概率,那么您并没有真正从测试中获得价值。

标签: c# roslyn


【解决方案1】:

Roslyn 绝对可以做到这一点。这将是与编写 AOP 编译器相同的工具。您需要修改代码然后编译它。此外,您还需要对修改后的代码的程序集运行测试。目前如何使用 Roslyn 执行此操作并不简单,但您可以尝试here 描述的方法。

【讨论】:

    猜你喜欢
    • 2019-01-12
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多