using System;
using System.Data;
using System.Reflection;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using ALite.Core.UnitTestSimple;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
namespace ALite.Core.Tests
{
[TestClass]
public class OrderUnitTest
{
private TestContext _testContextInstance;
public TestContext TestContext
{
get { return _testContextInstance; }
set { _testContextInstance = value; }
}
[TestMethod]
[Description("A normal unit testing for the method 'Submit.'")]
public void TestNormalSubmit()
{
// Mock
var mockPersistence = new Mock<IPersistence>();
mockPersistence.Setup(e => e.Save(It.IsAny<Order>())).Returns(true);
// Arrange
var target = new Order
{
PesistenceHandler = mockPersistence.Object
};
const bool expected = true;
// Action
bool result = target.Submit();
// Assert
Assert.AreEqual(expected, result);
}
[TestMethod]
// 是且只有是抛出DataException类型的异常时才会算通过,即便是子类也会判断为未通过
[ExpectedException(typeof(DataException))]
[Description("A unit testing for the method 'Submit' with a DataException when using the property PersistenceHandler")]
public void TestSubmitWithException()
{
// Mock
var mockPersistence = new Mock<IPersistence>();
mockPersistence.Setup(e => e.Save(It.IsAny<Order>())).Throws(new DataException());
// Arrange
var target = new Order
{
PesistenceHandler = mockPersistence.Object
};
const bool expected = true;
// Action
bool result = target.Submit();
// Assert
Assert.AreEqual(expected, result);
}
[TestMethod]
[Description("举例说明如何测试私有方法和使用TestProperty属性")]
[TestProperty("City", "深圳")]
[TestProperty("Province", "广东")]
[TestCategory("Category1")]
public void TestCountTotalPrice()
{
var method = Util.GetCallingMethod(false, 0);
var attributeType = typeof(TestPropertyAttribute);
var attributes = method.GetCustomAttributes(attributeType, true);
var city = ((TestPropertyAttribute)attributes[0]).Value;
var province = ((TestPropertyAttribute)attributes[1]).Value;
var address = string.Format("{0} {1}", province, city);
// Mock
var mockDeliveryManageHandler = new Mock<IDeliveryManage>();
mockDeliveryManageHandler.Setup(e => e.CountDeliveryFee(It.IsAny<string>())).Returns(10.00m);
// Arrange
var orderDetails1 = new OrderDetail()
{
TotalPrice = 10.00m
};
var orderDetails2 = new OrderDetail()
{
TotalPrice = 20.00m
};
var orderDetails3 = new OrderDetail()
{
TotalPrice = 30.00m
};
var details = new List<OrderDetail> {orderDetails1, orderDetails2, orderDetails3};
var target = new Order()
{
Destination = address,
DeliveryManageHandler = mockDeliveryManageHandler.Object,
OrderDetails = details
};
const decimal expected = 70m;
// Action
// 通过反射测试私有方法,比IDE提供的方式会更灵活一些
var typeTarget = typeof (Order);
var methodTarget = typeTarget.GetMethod("CountTotalPrice", BindingFlags.Instance | BindingFlags.NonPublic);
var objResult = methodTarget.Invoke(target, null);
// Assert
Assert.AreEqual(expected, (decimal)objResult);
}
[DeploymentItem("1.1-ALite.Core.Tests\\1.xml"), TestMethod]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", "|DataDirectory|\\1.xml", "Address", DataAccessMethod.Sequential)]
[Description("举例说明如何使用DataSourceAttribute属性, 该单元测试会读取数据源中的每一行数据进行测试")]
public void TestCountTotalPriceWithVarious()
{
var province = this._testContextInstance.DataRow["Province"];
var city = this._testContextInstance.DataRow["City"];
var fee = Convert.ToDecimal(this._testContextInstance.DataRow["Fee"]);
var address = string.Format("{0} {1}", province, city);
// Mock
var mockDeliveryManageHandler = new Mock<IDeliveryManage>();
mockDeliveryManageHandler.Setup(e => e.CountDeliveryFee(It.IsAny<string>())).Returns(10.00m);
// Arrange
var orderDetails1 = new OrderDetail()
{
TotalPrice = 10.00m
};
var orderDetails2 = new OrderDetail()
{
TotalPrice = 20.00m
};
var orderDetails3 = new OrderDetail()
{
TotalPrice = 30.00m
};
var details = new List<OrderDetail> { orderDetails1, orderDetails2, orderDetails3 };
var target = new Order()
{
Destination = address,
DeliveryManageHandler = mockDeliveryManageHandler.Object,
OrderDetails = details
};
decimal expected = fee;
// Action
// 通过反射测试私有方法,比IDE提供的方式会更灵活一些
var typeTarget = typeof(Order);
var methodTarget = typeTarget.GetMethod("CountTotalPrice", BindingFlags.Instance | BindingFlags.NonPublic);
var objResult = methodTarget.Invoke(target, null);
// Assert
Assert.AreEqual(expected, (decimal)objResult);
}
}
}