【发布时间】:2010-06-17 20:31:08
【问题描述】:
我正在开始我的第一次 C# 测试驱动开发之旅。首先,我使用 MSTest 和 Rhino.Mocks。我正在尝试针对我的ICustomerRepository 编写我的第一个单元测试。为每种测试方法新建一个Customer 似乎很乏味。在 ruby-on-rails 中,我会创建一个种子文件并为每个测试加载客户。我可以将这个样板 Customer 放入测试类的属性中似乎是合乎逻辑的,但是我会冒着被修改的风险。我有哪些简化此代码的选择?
[TestMethod]
public class CustomerTests : TestClassBase
{
[TestMethod]
public void CanGetCustomerById()
{
// arrange
var customer = new Customer()
{
CustId = 5,
DifId = "55",
CustLookupName = "The Dude",
LoginList = new[] {
new Login { LoginCustId = 5, LoginName = "tdude" } }
};
var repository = Stub<ICustomerRepository>();
// act
repository.Stub(rep => rep.GetById(5)).Return(customer);
// assert
Assert.AreEqual(customer, repository.GetById(5));
}
[TestMethod]
public void CanGetCustomerByDifId()
{
// arrange
var customer = new Customer()
{
CustId = 5,
DifId = "55",
CustLookupName = "The Dude",
LoginList = new[] {
new Login { LoginCustId = 5, LoginName = "tdude" } }
};
var repository = Stub<ICustomerRepository>();
// act
repository.Stub(rep => rep.GetCustomerByDifID("55")).Return(customer);
// assert
Assert.AreEqual(customer, repository.GetCustomerByDifID("55"));
}
[TestMethod]
public void CanGetCustomerByLogin()
{
// arrange
var customer = new Customer()
{
CustId = 5,
DifId = "55",
CustLookupName = "The Dude",
LoginList = new[] {
new Login { LoginCustId = 5, LoginName = "tdude" } }
};
var repository = Stub<ICustomerRepository>();
// act
repository.Stub(rep =>
rep.GetCustomerByLogin("tdude")).Return(customer);
// assert
Assert.AreEqual(customer, repository.GetCustomerByLogin("tdude"));
}
}
测试基类
public class TestClassBase
{
protected T Stub<T>() where T : class
{
return MockRepository.GenerateStub<T>();
}
}
ICustomerRepository 和 IRepository
public interface ICustomerRepository : IRepository<Customer>
{
IList<Customer> FindCustomers(string q);
Customer GetCustomerByDifID(string difId);
Customer GetCustomerByLogin(string loginName);
}
public interface IRepository<T>
{
void Save(T entity);
void Save(List<T> entity);
bool Save(T entity, out string message);
void Delete(T entity);
T GetById(int id);
ICollection<T> FindAll();
}
【问题讨论】:
标签: c# unit-testing tdd rhino-mocks mstest