問題タブ [autofixture]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - テストデータを使用してタイプのインスタンスを作成する方法はありますか?
タイプがあり、テストデータを使用してそのインスタンスを作成したいと思います。
NBuilderやAutoFixtureのようなフレームワークは、設計時に既知のタイプのインスタンスを作成できることを知っています(<T>
)。それらのフレームワークは、実行時にのみ認識されるタイプに基づいてインスタンスを作成できますか(Type
)?
最後に、私は次のようなことをしたいと思います。
c# - Autofixtureにインターフェイスタイプのプロパティを含むタイプのインスタンスを作成させるにはどうすればよいですか?
私はそのようなクラスを持っています:
IPaginationインターフェイスの周囲に動的プロキシを作成し、プロキシにテストデータを入力する必要があります。AutoFixtureにViewModelタイプのインスタンスを作成させることは可能ですか?私は実行時にタイプしか知らないことに注意してください(typeof(ViewModel)
)。
今では私はこれを行うことができることを知っています:
c# - AutoFixture AutoMoqに、インスタンス化されたオブジェクトに挿入されたサービスからの結果を返すようにするにはどうすればよいですか?
リポジトリサービスを利用するサービスクラスをテストしようとしています。リポジトリサービスで機能すると思われるカスタマイズを設定しましたが、代わりにデフォルトの匿名の結果を返します。以下のコードサンプルを見ると、svc.GetFoosメソッドを呼び出したときに、カスタマイズクラスに登録した「Foo」オブジェクトを取り戻そうとしていますが、何も得られません。
フィクスチャのインスタンス化後に次のコードをMainメソッドに追加すると、希望どおりに機能しますが、手動でモックを設定しているため、AutoFixtureAutoMoqが何を取得しているかわかりません。
ありがとう。
xunit - カスタム セオリー データ属性が AutoFixture 用に作成するフィクスチャを変更するにはどうすればよいですか?
XUnit の理論と組み合わせた AutoFixture のパワーを本当に高く評価しています。私は最近、カスタマイズをカプセル化し、属性を介してテストに提供する方法を採用しました。
場合によっては、テストを実行するための 1 回限りのシナリオが必要になります。上記のように AutoDomainDataAttribute を使用する場合、IFixture を要求して、属性によって作成された同じインスタンスを取得することを期待できますか?
私のシナリオでは、コレクションなどにデフォルトで MultipleCustomization を使用しています。ただし、この 1 つのケースでは、SUT のコンストラクターに送信されるアイテムは 1 つだけです。したがって、テストメソッドを次のように定義しました。
残念ながら、匿名の製品を作成するときに例外が発生します。これらの属性を持つメソッド パラメーターとして Product を要求すると、他のテストは正常に機能します。これは、フィクスチャ パラメータが AutoDomainDataAttribute によって作成されたものと同じであることを望んでいる、この特定のケースだけの問題です。
製品のコンストラクターは、AutoDomainData を介してインプレースで行ったカスタマイズにより、通常は 3 つの項目が入力される IEnumerable を想定しています。現在、私の DomainCustomization は、MultipleCustomization と AutMoqCustomization をこの順序で構成する CompositeCustomization です。
例外は、「InvalidCastException: タイプ 'Castle.Proxies.ObjectProxy' のオブジェクトをタイプ 'Product' にキャストできません。」です。
testing - AutoFixture に、それを継承するクラスのすべてのインスタンスに対して何らかの基本メソッドを呼び出すように指示できますか?
Entity
読み取り専用の Id プロパティを公開するクラスがあります。このプロパティは、保存後に ORM を介して設定されます (一時的ではなくなります)。Entity から継承するクラスのすべてのインスタンスに対して、内部的に Id プロパティを設定するメソッドを AutoFixture に呼び出させたいと考えています。
これらの子孫のいくつかの選択の作成を登録するフィクスチャにいくつかのカスタマイズが適用されているため、それらが最初に実行されることを確認したいと思います。理想的な状況は、匿名の値がフィクスチャから返される前に、何らかの変更コードを実行できるようにすることだと思います。
たとえば、 を呼び出すとfixture.CreateAnonymous<Order>()
、その Order インスタンスが返される前に変更できる他のカスタマイズ (など) があります。
この変更は だけOrder
ではなく、すべてEntity
の子孫を傍受します。
c# - moqで検証をデバッグする方法は?
データベース呼び出しメソッドにIDatabaseクラスに付属しているNPocoを使用しています。NPoco Insertメソッドに入るオブジェクトに正しいデータ(ドメインオブジェクトの形式)があることを確認したいと思います。
呼び出されているコード(検証をトリガーするもの)
c# - AutoFixture / AutoMoqは、注入されたインスタンス/凍結されたモックを無視します
解決策が見つかったので、簡単に説明します。
AutoFixtureは、モックを正常にフリーズして返します。AutoFixtureによって生成された私のsutには、テストにとって重要なローカルデフォルトのパブリックプロパティがあり、AutoFixtureが新しい値に設定されていました。マークの答えからそれを超えて学ぶことがたくさんあります。
元の質問:
私は昨日、MoqがいたるところにあるxUnit.netテストでAutoFixtureを試し始めました。Moqのものの一部を置き換えたり、読みやすくしたりしたいと思っていました。特に、SUTFactoryの容量でAutoFixtureを使用することに興味があります。
AutoMockingに関するMarkSeemannのブログ投稿をいくつか用意して、そこから作業を試みましたが、それほど遠くはありませんでした。
AutoFixtureを使用しない場合のテストは次のようになります。
ここでの話は十分に単純です-正しいキー(ハードコードされている/プロパティが挿入されている)で依存関係をSettingMappingXml
クエリしISettings
、結果をとして返すことを確認してXElement
ください。エラーがあるITracingService
場合にのみ関連します。
私がやろうとしていたのは、ITracingService
オブジェクトを明示的に作成してから手動で依存関係を挿入する必要をなくすことです(このテストが複雑すぎるためではなく、試して理解するのに十分簡単だからです)。
AutoFixtureを入力してください-最初の試み:
CreateAnonymous<SettingMappingXml>()
コンストラクターパラメーターが検出されると、そのインターフェイスに具体的なインスタンスが登録されていることに気づき、それを注入することを期待ISettings
しますが、それは行わず、代わりに新しい匿名の実装を作成します。
fixture.CreateAnonymous<ISettings>()
実際に私のインスタンスを返すので、これは特に混乱します-
テストを完全にグリーンにします。この行は、インスタンス化するときにAutoFixtureが内部で実行することを期待していたものとまったく同じSettingMappingXml
です。
次に、コンポーネントをフリーズするという概念があるので、モックオブジェクトを取得するのではなく、フィクスチャ内のモックをフリーズするだけで済みます。
確かに、これは完全に正常に機能します-SettingMappingXml
コンストラクターを明示的に呼び出し、に依存しない限りCreateAnonymous()
。
簡単に言えば、それが私が思いつくことができるどんな論理にも反するので、なぜそれが明らかにそれがするように働くのか理解していません。通常、私はライブラリのバグを疑うでしょうが、これは非常に基本的なものであるため、他の人がこれに遭遇し、長い間発見されて修正されていたと確信しています。さらに、テストとDIに対するMarkの熱心なアプローチを知っているので、これは意図的ではありません。
つまり、私はかなり初歩的な何かを見逃しているに違いありません。事前設定されたモックオブジェクトを依存関係としてAutoFixtureでSUTを作成するにはどうすればよいですか?私が今確信している唯一のことは、私が必要としているので、のAutoMoqCustomization
ために何も設定する必要がないということですITracingService
。
AutoFixture / AutoMoqパッケージは2.14.1、Moqは3.1.416.3で、すべてNuGetからのものです。.NETバージョンは4.5(VS2012とともにインストール)であり、動作はVS2012と2010で同じです。
この投稿を書いているときに、Moq 4.0とアセンブリバインディングリダイレクトに問題があることがわかったので、Moq 4のすべてのインスタンスのソリューションを細心の注意を払ってパージし、AutoFixture.AutoMoqを「クリーンな」プロジェクトにインストールしてMoq3.1をインストールしました。ただし、私のテストの動作は変更されていません。
ポインタや説明をありがとうございます。
更新: Markが要求したコンストラクターコードは次のとおりです。
完全を期すために、GetXml()
メソッドは次のようになります。
SettingKey
単なる自動プロパティです。
c# - 基本クラスから継承するものに AutoFixture のカスタマイズを適用するにはどうすればよいですか?
単体テストを DRY しようとして、AutoFixture を IoC コンテナーとして使用して、テスト対象のシステム (SUT) をインスタンス化しようとしています。この特定Controller
のケースでは ASP.NET MVC です。したがって、AutoFixture をカスタマイズして、自動プロパティのないコントローラーを作成したいと考えています。
のカスタマイズを追加しようとしましたControllerBase
が、 のサブクラスでは機能しないようですControllerBase
。
書きたいテストの例を次に示します。
当然のことながら、プロジェクト内の特定のコントローラーごとに 1 つのカスタマイズを手動で追加すれば機能しますが、誰がそれをしたいでしょうか? より良い方法はありますか?
interface - AutoMoqCustomizationは抽象クラスに対して機能しますか?
注意してください、私はTDDに少し慣れていないので、一般的なアドバイスと具体的な回答を取ります。
抽象クラスもインターフェースもインスタンス化できません。明らかに、Moqは2番目のテストでADataFeedのモックアップインスタンスを提供できます。AutoMoqCustomizationがインターフェイスに対して機能するIDataFeed
のに、抽象クラスに対しては機能せずADataFeed
、代わりにInvalidOperationExceptionをスローするのはなぜですか?
次に、AutoFixtureアプローチ(または一般的にTDD)は、この場合の接続文字列などの特定の値を要求および保証するコンストラクターを備えた抽象クラスを必要とする可能性のある設計を駆動することでしょうか?
c# - 子エンティティへのパスが複数ある場合、オブジェクトを生成するにはどうすればよいですか?
私はこれに似たドメインモデルを持つアプリに取り組んでおり、 a は a と a の両方からLineItem
参照できます。Order
Shipment
AutoFixture を使用して を生成している場合、 との両方にOrder
の同じセットを使用するにはどうすればよいですか?LineItems
order.LineItems
order.Shipments*.ItemShipments*.LineItem
理論的には、次のテストに合格する必要があります。
...テストに応じて、部分的に出荷された注文も生成できるようにしたいと思います。
(Order の項目と Shipment の項目は別のものであり、それらを表すために同じクラスを使用すべきではないという確固たる議論があります。しかし、私が扱っているデータは、レガシーシステムであり、それについてできることはあまりありません。)