9

まず第一に、私はSpecFlowに不慣れです。

完全にセットアップされたサーバー、データアクセスを含む機能テストとして実行するためにMSTestを使用して自動化する機能ファイルがあります...この目的のために、SpecFlowの「Given」のデータを使用してサーバーを構成する必要がありますブロックし、後で開始します。また、いくつかのファイルをテストの出力ディレクトリにコピーする必要があります。

SpecFlow以外の機能テストでは、ClassInitialize属性を使用して、TestContextからTestDeploymentDirを取得していました。このようなもの:

[ClassInitialize]
public static void ClassSetup(TestContext context)
{
  TargetDataDeploymentRoot = context.TestDeploymentDir;
}

SpecFlowでは、SpecFlow自体によって使用されるため、この属性を使用できなくなりました。同様に機能するBeforeFeatureのように、いくつかの新しい属性が存在しますが、パラメーターとしてTestContextを渡しません。

機能テストサーバーを実際に起動する前に、TestContextのTestDeploymentDirにアクセスしてファイルをコピーする必要があります。これは、SpecFlowなしでは簡単に実行できますが、SpecFlowではほとんど不可能です。

この問題に対処する方法は?

それは可能ですか?

アドバイスありがとうございます!

ロバート


環境:

  • Visual Studio 2012
  • SpecFlow 1.9.0.77
4

4 に答える 4

5

SpecFlow 2.2.1 以降、TestContext は Context Injection 経由で利用できます。( https://github.com/techtalk/SpecFlow/pull/882 )

コンテナーから直接取得できます。

ScenarioContext.Current.ScenarioContainer.Resolve<Microsoft.VisualStudio.TestTools.UnitTesting.TestContext>()

またはコンテキスト注入を介して:

public class MyStepDefs
{
    private readonly TestContext _testContext;
    public MyStepDefs(TestContext testContext) // use it as ctor parameter
    { 
        _testContext = testContext;
    }

    [BeforeScenario()]
    public void BeforeScenario()
    {
        //now you can access the TestContext
    } 
}
于 2017-09-14T10:55:29.443 に答える
3

TestContext の値にアクセスするには、.

using Microsoft.VisualStudio.TestTools.UnitTesting;
using TechTalk.SpecFlow;

/// <summary>
/// Partial class for TestContext support.
/// </summary>
public partial class DistributionFeature
{
    /// <summary>
    /// Test execution context.
    /// </summary>
    private TestContext testContext;

    /// <summary>
    /// Gets or sets test execution context.
    /// </summary>
    public TestContext TestContext
    {
        get
        {
            return this.testContext;
        }

        set
        {
            this.testContext = value;

            //see https://github.com/techtalk/SpecFlow/issues/96
            this.TestInitialize();
            FeatureContext.Current["TestContext"] = value;
        }
    }
}

次に、次を使用して、ステップから展開ディレクトリにアクセスできます

var testContext = (TestContext)FeatureContext.Current["TestContext"];
var deploymentDir = testContext.TestDeploymentDir;

シナリオが多すぎる場合は、そのようなファイルの作成を T4 で自動化する必要があります。

于 2013-06-03T06:24:14.563 に答える
-1

FeatureContext と、より一般的に使用される ScenarioContext があります。もちろん違いは、FeatureContext は完全な機能の実行中に存在するのに対し、ScenarioContext はシナリオ中にのみ存在することです。

例えば:

コンテキストに追加:

ScenarioContext.Current.Add("ObjectName", myObject);

得る:

var myObject = ScenarioContext.Current.Get<object>("ObjectName");

詳細については、こちらをご覧ください。

于 2012-09-02T21:43:28.563 に答える