存在しない WCF サービスの受け入れテストを作成することから始めます。
private Uri _baseAddress = new Uri("http://localhost:8713/service1");
private IService1 _client;
[SetUp]
public void Setup()
{
var binding = new BasicHttpBinding();
var endpoint = new EndpointAddress(_baseAddress);
var factory = new ChannelFactory<IService1>(binding, endpoint);
_client = factory.CreateChannel();
}
[TearDown]
public void TearDown()
{
if (_client != null)
((ICommunicationObject)_client).Close();
}
[Test]
public void ShouldReturnSampleData()
{
Assert.That(_client.GetData(42), Is.EqualTo("You entered: 42"));
}
まだ何も作成されていないことに注意してください。テストから始めます。これで、サービス インターフェイスを作成できます。
public interface IService1
{
string GetData(int value);
}
テストはコンパイルされるようになりましたが、もちろん、エラーで失敗します
IService1 のコントラクト タイプを取得しようとしましたが、そのタイプは ServiceContract ではなく、ServiceContract を継承していません。
これは、インターフェイスを[ServiceContract]
属性でマークする必要があるためです。この属性を追加して、テストを再度実行します。
メソッド GetData はこのプロキシではサポートされていません。これは、メソッドが OperationContractAttribute でマークされていない場合、またはインターフェイス タイプが ServiceContractAttribute でマークされていない場合に発生する可能性があります。
わかりました、必要な属性でサービス インターフェイスをマークします。
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value);
}
ここで、別のエラーが表示されます (存在しないサービスを実際に実行しているものがないため)。
http://localhost:8713/service1
メッセージを受け入れることができるリッスンしているエンドポイントがありませんでした。これは、多くの場合、アドレスまたは SOAP アクションが正しくないことが原因です。詳細については、InnerException (存在する場合) を参照してください。
ServiceHost を使用してサービスを実行できます (現時点では、テストをコンパイルするサービス クラスを作成する必要があります)。
private ServiceHost _host;
[SetUp]
public void Setup()
{
_host = new ServiceHost(typeof(Service1), _baseAddress);
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
_host.Description.Behaviors.Add(smb);
_host.Open();
// creating client as above
}
[TearDown]
public void TearDown()
{
// closing client as above
if (_host != null)
_host.Close();
}
また、サービス クラスごとに IService1 インターフェイスを実装する必要があります (そうしないと、テストは失敗します)。
public class Service1 : IService1
{
public string GetData(int value)
{
throw new NotImplementedException();
}
}
ここで、GetData 機能を実装するために、Service1 クラスの単体テストをいくつか作成しました。これらのテストに合格すると、受け入れテストにも合格します。それでおしまい。最初にテストを行い、WCF サービスをホストする準備が完全に整いました。