.net中的Web服务中的单元测试类

时间:2010-05-18 00:09:57

标签: .net web-services unit-testing

经过一番挖掘,我接受了这个帖子中的建议:How to unit test C# Web Service with Visual Studio 2008

我创建了一个单独的类,我的Web服务类只是该类的包装器。问题是,当我尝试在VS2008中创建一个单元测试项目时,它坚持创建一个单元测试,就像我正在测试Web服务调用而不是我指定的类。我无法进入我试图测试的课程。

我有一个网络服务“subscription_api.asmx”。后面的代码是“subscription_api.cs”,其中包含对“subscription.cs”中实际代码的Web方法包装调用。

我希望能够做到以下几点:

[TestMethod()]
        public void GetSystemStatusTest()
        {
            subscription sub = new subscription();
            XmlNode node = sub.GetSystemStatusTest();
            Assert.IsNotNull(node);
        }

但相反,我得到了这个从VS'08自动生成的混乱:

/// <summary>
        ///A test for GetSystemStatus
        ///</summary>
        // TODO: Ensure that the UrlToTest attribute specifies a URL to an ASP.NET page (for example,
        // http://.../Default.aspx). This is necessary for the unit test to be executed on the web server,
        // whether you are testing a page, web service, or a WCF service.
        [TestMethod()]
        [HostType("ASP.NET")]
        [AspNetDevelopmentServerHost("C:\\CVSROOT\\rnr\\pro\\product\\wms\\ss\\subscription_api", "/subscription_api")]
        [UrlToTest("http://localhost/subscription_api")]
        public void GetSystemStatusTest()
        {
            subscription_Accessor target = new subscription_Accessor(); // TODO: Initialize to an appropriate value
            XmlNode expected = null; // TODO: Initialize to an appropriate value
            XmlNode actual;
            actual = target.GetSystemStatus();
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Verify the correctness of this test method.");
        }

此外,Test References文件夹中有“subscription_api.accessor”。

当我尝试这个时:

[TestMethod()]
public void GetSystemStatusTest2()
{
    subscription_Accessor sub = new subscription_Accessor();
    XmlNode node = sub.GetSystemStatus();
    Assert.IsNotNull(node);
}

我收到错误:

Test method subscription_api.Test.subscriptionTest.GetSystemStatusTest2 threw exception:  System.TypeInitializationException: The type initializer for 'subscription_Accessor' threw an exception. --->  System.ArgumentNullException: Value cannot be null.

我对单元测试真的很陌生并感到迷茫。如何在不测试Web服务的情况下为“subscription.cs”中的订阅类创建单元测试?我是否仅限于在同一个项目中进行测试(我希望不是)?我是否必须将目标类放在Web服务项目之外的自己的项目中?

2 个答案:

答案 0 :(得分:2)

听起来您的Web服务是在“网站”项目中创建的,而不是“Web应用程序”项目。问题是,网站不是基于您可以引用的单个DLL构建的,因为Web项目是。

如果是这种情况并且您正在使用网站类型项目,那么您需要将其转换为Web应用程序项目以利用直接对代码进行单元测试。有很多关于如何转换项目的博客文章,只是搜索“将asp.net网站转换为网络应用程序”。

或者/另外,您可能希望将此代码移动到它自己的类库中,并在包含Web服务的项目中引用该库。

答案 1 :(得分:-1)

要在网站项目中测试WCF服务,您还可以使用“添加服务引用”将服务添加到测试项目中。作为网址,输入http://localhost:4324/...?wsdl网址。

现在你可以写一个测试方法:

[TestClass()]
public class MyServiceTest
{
    #region -- Webservice initialisation

    // The client object for the WCF service.
    private static MyServiceNamespace.MyServiceClient _service;

    [ClassInitialize]
    public static void InitializeClass(TestContext ctx)
    {
        _service = new MyServiceNamespace.MyServiceClient();
    }

    [ClassCleanup]
    public static void CleanupClass()
    {
        _service.Close();
    }

    #endregion


    // An example test
    [TestMethod()]
    public void GetBlaBlaTest()
    {
        var actual = _service.GetBlaBla();
        Assert.IsTrue(actual.Status.IsSuccess, "Call should return success status");
        Assert.AreEqual("blabla", actual.Result, "Call should return the string 'blabla'");
    }
}

项目启动时,单元测试应用程序和网站项目都将启动,测试将针对ASP.NET开发服务器运行。这样做的好处是任何初始化代码也可以正常运行,模拟服务的实际使用。