/// <remarks>
   
    /// For the built-in <see cref="Connection"/> types
   
    /// (i.e. DesktopConnection, NicConnection, WirelessConnection, WiredConnection),
   
    /// only the class name is required.  For user created types, the fully qualified
   
    /// class name is required.
   
    /// </remarks>
   
    public static Connection CreateConnection(string connectionType, int price)
   
    {
   
    Guard.StringNotNullOrEmpty(connectionType, "connectionType");
   
    if (price < 0)
   
    {
   
    throw new ArgumentOutOfRangeException("price");
   
    }
   
    Connection connection;
   
    switch (connectionType)
   
    {
   
    case DesktopConnection:
   
    connection = new DesktopConnection(DesktopConnection, price);
   
    break;
   
    case NicConnection:
   
    connection = new NicConnection(NicConnection, price);
   
    break;
   
    case WirelessConnection:
   
    connection = new WirelessConnection(WirelessConnection, price);
   
    break;
   
    case WiredConnection:
   
    connection = new WiredConnection(WiredConnection, price);
   
    break;
   
    default:
   
    try
   
    {
   
    Type connectionTypeToCreate = Type.GetType(connectionType, true);
   
    Object createdObject = Activator.CreateInstance(connectionTypeToCreate, connectionTypeToCreate.Name, price);
   
    connection = createdObject as Connection;
   
    }
   
    catch(TypeLoadException ex)
   
    {
   
    throw new ConnectionMonitorException("Unsupported connection type.", ex);
   
    }
   
    if (connection == null)
   
    {
   
    throw new ConnectionMonitorException("Unsupported connection type.");
   
    }
   
    break;
   
    }
   
    return connection;
   
    }
   
    }
   
    }
   
    测试类:(ConnectionFactoryFixture.cs) 主要测试了CreateConnection这个方法的逻辑分支,以及抛出的各种异常。
   
    using System;
   
    using System.Text;
   
    using System.Collections.Generic;
   
    using NUnit.Framework;
   
    using Microsoft.Practices.SmartClient.ConnectionMonitor.Implementations;namespace Microsoft.Practices.SmartClient.ConnectionMonitor.Tests
   
    {
   
    /// <summary>
   
    /// Summary description for ConnectionFactoryFixture
   
    /// </summary>
   
    [TestFixture]
   
    public class ConnectionFactoryFixture
   
    {
   
    public ConnectionFactoryFixture()
   
    {
   
    }
   
    [Test]
   
    public void CanCreateDesktopConnection()
   
    {
   
    Connection connection = ConnectionFactory.CreateConnection("DesktopConnection", 1);
   
    Assert.IsNotNull(connection);
   
    Assert.IsTrue(connection is DesktopConnection);
   
    }
   
    [Test]
   
    public void CanCreateNicConnection()
   
    {
   
    Connection connection = ConnectionFactory.CreateConnection("NicConnection", 1);
   
    Assert.IsNotNull(connection);
   
    Assert.IsTrue(connection is NicConnection);
   
    }
   
    [Test]
   
    public void CanCreateWirelessConnection()
   
    {
   
    Connection connection = ConnectionFactory.CreateConnection("WirelessConnection", 1);
   
    Assert.IsNotNull(connection);
   
    Assert.IsTrue(connection is WirelessConnection);
   
    }
   
    [Test]
   
    public void CanCreateWiredConnection()
   
    {
   
    Connection connection = ConnectionFactory.CreateConnection("WiredConnection", 1);
   
    Assert.IsNotNull(connection);
   
    Assert.IsTrue(connection is WiredConnection);
   
    }
   
    [Test]
   
    public void CanCreateMyCustomConnection()
   
    {
   
    Connection connection = ConnectionFactory.CreateConnection("Microsoft.Practices.SmartClient.ConnectionMonitor.Tests.MyCustomConnection,SmartClient.ConnectionMonitor.Tests", 1);
   
    Assert.IsNotNull(connection);
   
    Assert.IsTrue(connection is MyCustomConnection);
   
    }
   
    [Test]
   
    [ExpectedException(typeof(ConnectionMonitorException))]
   
    public void CreateConnectionThrowsWhenPassedBadType()
   
    {
   
    Connection connection = ConnectionFactory.CreateConnection("BadTypeName", 1);
   
    }
   
    [Test]
   
    [ExpectedException(typeof(ArgumentNullException))]
   
    public void CreateConnectionThrowsWhenPassedNullType()
   
    {
   
    Connection connection = ConnectionFactory.CreateConnection(null, 1);
   
    }
   
    [Test]
   
    [ExpectedException(typeof(ArgumentException))]
   
    public void CreateConnectionThrowsWhenPassedEmptyType()
   
    {
   
    Connection connection = ConnectionFactory.CreateConnection(String.Empty, 1);
   
    }
   
    [Test]
   
    [ExpectedException(typeof(ArgumentOutOfRangeException))]
   
    public void CreateConnectionThrowsWhenPassedNegativePrice()
   
    {
   
    Connection connection = ConnectionFactory.CreateConnection("WiredConnection", -1);
   
    }
   
    }
   
    }
   
    2. NUnit单元测试,使用MOCK对象模拟外部依赖条件:
   
    假如某个方法依赖于其他一些难以操控的东西,比如说网络连接,数据库连接,数据库表记录,或者外部XML文件,那么我们该怎么办呢?
   
    这无疑会加大我们测试工作的难度与力度。 而这些数据库连不上,数据读不到,文件打不开等情况又是经常会遇到的,难道因为难测试放弃测试吗?很多人采取的态度是不测试,或者只准备在大规模集成测试的时候再手动测试一遍。
   
    这样做有个坏处,那是如果你的程序对异常情况没有处理好的话你只可能在大规模集成测试的时候才会发觉,而且这会消耗掉你非常多的时间去定位并解决它,因为已经过了很长时间了,没准依赖这段bug代码的代码已经有很多了,如果你的程序没有自动化回归测试的保护(可重构的)并且设计的依赖性较强的话那么你很可能会花上几个小时到几天的时间去解决一个当初可以在几分种内解决的bug.
   
    我们可以利用MOCK对象来模拟外部环境。
   
    使用mock对象进行测试的时候,我们总共需要3个步骤,分别是:
   
    1. 使用一个接口来描述这个对象
   
    2. 为产品代码实现这个接口
   
    3. 以测试为目的,在mock对象中实现这个接口
   
    在此我们又一次看到了针对接口编程的重要性了。因为被测试的代码只会通过接口来引用对象,所以它完全可以不知道它引用的究竟是真实的对象还是mock对象。(如果系统没有很好的设计和解耦,测试起来的确有些难度。此时解决的办法是重构系统。)