テストしようとしているコードにもう少し情報を追加できれば、それは素晴らしいことです。あなたが書いたことに基づいて、いくつかのオプションを推測できます。
現時点で最も侵襲性が低いのは、おそらくあなたの質問で提案したアプローチでしょう。インターフェイスまたは共通の基本クラス/アダプターを偽造したいメンバーに追加して、virtual
動的プロキシを使用するライブラリをモックすることでピックアップできるようにします(NSubstituteなど) 、Moq、FakeItEasy、Rhino モック)。
IInputControl<T>
そのようなものがあればT Value { get; set;}
、テストでそのタイプを置き換えることができます。IInputControl<T>
ではなくとして参照を保存するようにコードを更新する必要がありますがTextBox
、コードを の詳細から分離するので、それは悪いことではないかもしれませんTextBox
。
TextBox
もう 1 つのオプション (既に行っているかどうかは不明) は、Model-View-Presenter スタイルを使用し、ビューがメッセージを他のコントロールに変換する方法の詳細を単体テストしないことです。(エンド ツー エンド テストに受け入れテストを使用できます。)
例として、次のようなプレゼンターとビュー インターフェイスがあるとします。
public class PersonPresenter {
public PersonPresenter(IPersonView view, IPersonQuery query) { ... }
public void Load() {
var person = query.Execute();
view.Name = person.Name;
view.Age = person.Age;
}
}
public interface IPersonView {
string Name { get; set; }
int Age { get; set; }
}
次のようなものでテストできます。
[Test]
public void ShouldDisplayPersonOnLoad() {
var view = Substitute.For<IPersonView>();
var query = Substitute.For<IPersonQuery>();
query.Execute().Returns(new Person("A", 20));
var subject = new PersonPresenter(view, query);
subject.Load();
Assert.That(view.Name, "A");
Assert.That(view.Age, 20);
}
その後、実際のビューを既存のコントロールに委任できます。これは単体テストではテストされていませんが、受け入れテストが可能であるか、ビューが変更されるたびに手動でテストされる可能性があります。理想的には、このコードは、あまり多くのバグを隠してしまわないように単純にする必要があります。アイデアは、ビューをできるだけ単純にすること、そして主にロジックではなく情報の外観に関心を持つことです。
public PersonView : IPersonView {
// ...
public string Name {
get { return nameTextBox.Value; }
set { nameTextBox.Value = value; }
}
public int Age {
get { return ageIntTextBox.Value; }
set { ageIntTextBox.Value = value; }
}
}