我正在使用MsTest和RhinoMocks一起练习测试驱动开发,并且我试图尽可能地懒惰,也就是尽可能地利用VS2012自动生成。但是,仅仅为了设置我的类及其构造器和属性,使用Arrange-Act-Assert方法创建整个测试方法并不总是正确的。
目前,我发现在我的测试类中创建一些属性是最简单的-即使我不使用它们-仅用于代码生成。我的问题是,这是一个坏习惯吗,有没有更好/更容易的方法呢?欢迎任何评论,好的或坏的;谢谢!
[TestClass]
public class MainViewModelTest
{
private MainViewModel MainViewModel
{
get
{
var facilityDataEntity = MockRepository.GenerateStub<FacilityDataEntity>();
var viewModel = new MainViewModel(facilityDataEntity)
{
FacilityValue = string.Empty,
FacilityLabel = string.Empty
};
return viewModel;
}
}
private MainViewModel MainViewModelWithFacilityAndShopOrderData
{
get
{
var facilityDataEntity = MockRepository.GenerateStub<FacilityDataEntity>();
var shopOrderDataEntity = MockRepository.GenerateStub<ShopOrderDataEntity>();
var viewModel = new MainViewModel(facilityDataEntity, shopOrderDataEntity)
{
FacilityValue = string.Empty,
FacilityLabel = string.Empty,
ShopOrder = 99999999,
RequiredQuantity = 0M,
ItemCode = string.Empty,
ItemDescription = string.Empty
};
return viewModel;
}
}
[TestMethod]
public void MainViewModel_TranslateDataEntityListMethodReturnsMainViewModelRecords()
{
// Arrange
var facilityDataEntityList = MockRepository.GenerateStub<IEnumerable<FacilityDataEntity>>();
var shopOrderDataEntityList = MockRepository.GenerateStub<IEnumerable<ShopOrderDataEntity>>();
// Act
IEnumerable<MainViewModel> facilityResults = MainViewModel.TranslateDataEntityList(facilityDataEntityList);
IEnumerable<MainViewModel> shopOrderResults = MainViewModel.TranslateDataEntityList(facilityDataEntityList, shopOrderDataEntityList);
// Assert
Assert.IsInstanceOfType(facilityResults, typeof(IEnumerable<MainViewModel>));
Assert.IsInstanceOfType(shopOrderResults, typeof(IEnumerable<MainViewModel>));
}
}发布于 2013-03-08 22:53:12
这就是ClassInitialize功能的用途。在做某事之前,我会选择预期的和推荐的方法。它更容易识别,并且理解代码所需的时间更少。
发布于 2013-03-07 23:42:59
在您的测试类中包装公共代码没有错,但我会避免在您的测试之间共享状态。
这里有两种方法可以使用。
类/测试初始化
正如Peter在他的评论中提到的那样,包含初始化方法来为您做这类事情非常容易。
//Only runs once per test run
[ClassInitialize]
public void InitClass(){
//Ideally this should be reserved for expensive operations
// or for setting properties that are static throughout
// the lifetime of your test.
}
//Runs for every test
[TestInitialize]
public void TestInit(){
//Here you can setup common stub/mock behavior
// that will be common for every test, but ensure
// it is clean for each test run
}设置/工厂方法
另一种选择是创建专门的设置或工厂方法,这些方法可用于减少重复的测试代码,并使您的测试意图更清晰。
[TestMethod]
public void ShouldFailIfUserNameIsTed(){
var user = SetupUserScenario("Ted");
var result = _myUserService.Validate(user);
Assert.IsFalse(result);
}
private User SetupUserScenario(String username){
var user = new User();
user.Name = username;
//Do a bunch of other necessary setup
return user;
}希望这一切都是有意义的,但我也要提醒您不要对此过于疯狂。如果你在设置方法中放了太多东西,那么你的测试就会变得不那么清晰。您应该能够阅读测试并弄清楚发生了什么,而不必检查代码中的许多其他地方。
https://stackoverflow.com/questions/15274593
复制相似问题