1

これを実装する方法を考えていますが、私の知識が貧弱すぎて実装を理解できないようです。

ソース コードを DLL にコンパイルするコードがあります。

次に、この Dll で単体テストを実行し、内部の 3 ~ 4 つのメソッドをチェックする必要があります。

この方法で単体テストを実行しようとしています。

CompilerResults compileResults = codeProvider.CompileAssemblyFromSource(compilerParameters, new string[] { sourceCode });

            Assembly myAssembly = compileResults.CompiledAssembly;

            TestPackage testPackage = new TestPackage(@"TestingProject.dll");
            testPackage.Assemblies.Add(myAssembly);

            RemoteTestRunner remoteTestRunner = new RemoteTestRunner();
            remoteTestRunner.Load(testPackage);
            TestResult testResult = remoteTestRunner.Run(new NullListener(),TestFilter.Empty,false,LoggingThreshold.All);

そして、これはたとえばテスト

   [Test]
    public void AddTest(IDynamicScript s)
    {            
        Assert.AreEqual(10, s.Add(5,5));
        Assert.AreNotEqual(10,s.Add(4,5));

    }

アセンブリは動的にコンパイルされるため、単体テスト プロジェクトを参照できず、コンパイルされません。これを実装する方法について何か提案をお願いします。

4

1 に答える 1

1

あなたのコードは、いくつかの変更の後、問題なく動作します。必要な変更は次のとおりです。

  • テスト コードは、適切な名前空間のインポートを使用してクラスにラップする必要があります。C# コンパイラでスタンドアロン メソッドをコンパイルすることはできません。
  • コンパイルしているコードのアセンブリ参照についてコンパイラに通知する必要があります。この場合nunit.framework.dll、メインの AppDomain にロードされたコピーの場所から取得したアセンブリへのパスを指定しましたが、それを参照することもできます。ロードせずにファイルシステムから。通常、テストするコードを含むアセンブリのパスも指定する必要があります。
  • クラスのコンストラクターは、TestPackageそのコンストラクターで絶対パスを取ります。この場合、生成されたアセンブリの場所を指定しました

これは、修正を加えたコードです。

var sourceCode = @"
using NUnit.Framework;

public class Fixture
{
    [Test]
    public void AddTest()
    {            
        Assert.AreEqual(10, 5+5);
    }
}";

var provider = new CSharpCodeProvider();

CompilerResults compileResults = provider.CompileAssemblyFromSource(
    new CompilerParameters(new[]{ typeof(TestAttribute).Assembly.Location }), 
    new[]{ sourceCode });

var assembly = compileResults.CompiledAssembly;
var package = new TestPackage(assembly.Location);
var runner = new RemoteTestRunner();

runner.Load(package);

var result = runner.Run(new NullListener(), 
                        TestFilter.Empty, 
                        false, 
                        LoggingThreshold.All);
于 2012-10-31T22:29:18.167 に答える