首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TDD -使用属性自动生成代码

TDD -使用属性自动生成代码
EN

Stack Overflow用户
提问于 2013-03-07 23:06:47
回答 2查看 242关注 0票数 2

我正在使用MsTest和RhinoMocks一起练习测试驱动开发,并且我试图尽可能地懒惰,也就是尽可能地利用VS2012自动生成。但是,仅仅为了设置我的类及其构造器和属性,使用Arrange-Act-Assert方法创建整个测试方法并不总是正确的。

目前,我发现在我的测试类中创建一些属性是最简单的-即使我不使用它们-仅用于代码生成。我的问题是,这是一个坏习惯吗,有没有更好/更容易的方法呢?欢迎任何评论,好的或坏的;谢谢!

代码语言:javascript
复制
[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>));
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-08 22:53:12

这就是ClassInitialize功能的用途。在做某事之前,我会选择预期的和推荐的方法。它更容易识别,并且理解代码所需的时间更少。

票数 1
EN

Stack Overflow用户

发布于 2013-03-07 23:42:59

在您的测试类中包装公共代码没有错,但我会避免在您的测试之间共享状态。

这里有两种方法可以使用。

类/测试初始化

正如Peter在他的评论中提到的那样,包含初始化方法来为您做这类事情非常容易。

代码语言:javascript
复制
//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

}

设置/工厂方法

另一种选择是创建专门的设置或工厂方法,这些方法可用于减少重复的测试代码,并使您的测试意图更清晰。

代码语言:javascript
复制
[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;
}

希望这一切都是有意义的,但我也要提醒您不要对此过于疯狂。如果你在设置方法中放了太多东西,那么你的测试就会变得不那么清晰。您应该能够阅读测试并弄清楚发生了什么,而不必检查代码中的许多其他地方。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15274593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档