Testdriven Remoting в C # - Нужен ли отдельный сервер AppDomain? - PullRequest
3 голосов
/ 08 декабря 2008

Я хотел начать с использования Remoting под C # в тестовом режиме, но я застрял.

Одна вещь, которую я нашел по этой теме, - это статья Марка Клифтона , но он, кажется, запускает сервер, запуская его вручную с консоли.

Я пытаюсь запустить сервер (т.е. зарегистрировать класс обслуживания) в тестовом приборе. Я, вероятно, также неправильно использую интерфейс, но это будет позже.

Я всегда получаю исключение (извините за немецкое сообщение), что канал уже зарегистрирован. System.Runtime.Remoting.RemotingException: Der Channel tcp wurde bereits registriert.

После комментирования строки ChannelServices.RegisterChannell () в тестовом методе это происходит для вызова Activator.GetObject ().

Я пытался поместить StartServer () в поток, но это тоже не помогло. Я обнаружил, что создание нового AppDomain может быть возможным способом, но еще не пробовал.

Можете ли вы сказать мне, если мой подход по своей сути неверен? Как я могу это исправить?

using System;
using NUnit.Framework;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

namespace Bla.Tests.Remote
{
    [TestFixture]
    public class VerySimpleProxyTest
    {
        int port = 8082;
        string proxyUri = "MyRemoteProxy";
        string host = "localhost";

        IChannel channel;

        [SetUp]
        public void SetUp()
        {
            StartServer();
        }

        [TearDown]
        public void TearDown()
        {
            StopServer();
        }

        [Test]
        public void UseRemoteService()
        {
            //IChannel clientChannel = new TcpClientChannel();
            //ChannelServices.RegisterChannel(clientChannel, false);
            string uri = String.Format("tcp://{0}:{1}/{2}", host, port, proxyUri);
            IMyTestService remoteService = (IMyTestService)Activator.GetObject(typeof(IMyTestService), uri);

            Assert.IsTrue(remoteService.Ping());
            //ChannelServices.UnregisterChannel(clientChannel);
        }

        private void StartServer()
        {
            channel = new TcpServerChannel(port);
            ChannelServices.RegisterChannel(channel, false);
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyTestService), proxyUri, WellKnownObjectMode.Singleton);
        }

        private void StopServer()
        {
            ChannelServices.UnregisterChannel(channel);
        }
    }

    public interface IMyTestService
    {
        bool Ping();
    }

    public class MyTestService : MarshalByRefObject, IMyTestService
    {
        public bool Ping()
        {
            return true;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 18 марта 2009

У меня нет решения вашей проблемы, но я бы посоветовал не писать юнит-тесты таким образом. Смотрите этот пост . Какой код вы действительно хотите проверить здесь. Я почти уверен, что Microsoft провела большую часть тестирования функции Remoting, которая поставляется с .net. Класс, который реализует ваш интерфейс Сервиса, может быть проверен модулем в процессе, просто обновив реализацию. Код, который регистрирует ваш интерфейс службы, был бы тестируемым, если бы инфраструктура .net не использовала статику для регистрационного бита, но увы. Вы можете попытаться передать макет IChannel на ChannelServices.RegisterChannel и каким-то образом проверить свой регистрационный код, но, по моему мнению, это будет пустой тратой времени.

Я просто хотел бы заявить, что тестирование должно быть средством для достижения цели, а не самоцелью.

0 голосов
/ 11 декабря 2008

Я нашел хороший способ сделать именно то, что хотел, просто используя WCF вместо Remoting.

Я перенес исходный код, приведенный в статье Яира Коэна , в NUnit менее чем за 5 минут, и он работает "из коробки".

...