我可以在编写TypeScript单元测试时使用Monkey-patch依赖项

时间:2015-05-21 10:54:25

标签: javascript unit-testing mocking typescript monkeypatching

我们的Web应用程序具有非常丰富的Javascript前端,具有大量自定义小部件,向导等。我们正在考虑将其中的一些(可能最终全部)迁移到TypeScript,主要是为了更轻松的好处重构/减少错误。

我们已经为小部件/客户端业务逻辑进行了JavaScript单元测试 - 我们通过Karma运行。目前我们的断言都使用YUI测试框架,但我们并不特别关注它。

由于我们将代码库移动到TypeScript,因此考虑在TypeScript中编写一些灯具似乎也是合理的(为了同样的好处)。另请注意,我们的TypeScript代码的JavaScript输出并不像我们手工编写的JavaScript代码那样友好,所以这是另一个原因(想要针对TypeScript编写测试)。

目前,我们的一些单元测试将会是#猴子补丁"询问被测代码的依赖关系。例如,我们可以用模拟对象替换浏览器的XmlHttpRequest对象,以便我们可以推断出我们的代码如何与真实的 XmlHttpRequest对象进行交互。

我们目前通过仅替换测试持续时间的依赖性来做到这一点,例如window.XmlHttpRequest = MyMockObject;

有没有人对这种做法有任何想法,特别是关于如何在TypeScript中实现它与JavaScript不同的想法?

请注意,我不是修改代码的粉丝,其唯一目的是使单元测试更容易(例如,要求依赖项始终注入而不是假设存在)。

1 个答案:

答案 0 :(得分:1)

sinon库(具有TypeScript绑定)已经完成了这项工作,特别支持伪造XMLHttpRequest(和定时器)。在可能的情况下使用它似乎是最好的选择。

有许多方法可以解决TypeScript中的类型检查问题。

  • 指定任何类型的值(始终允许)
  • 编写JavaScript函数为您执行脏工作(然后为该函数编写TypeScript定义)。这基本上是使用TypeScript
  • 中的sinon FakeXMLHttpRequest功能时发生的情况
  • @Configuration @EnableTransactionManagement @MapperScan("org.app.researchportal.core.persistence") public class PersistenceConfig { @Autowired Environment environment; /** * Gets the datasource from the container using JNDI and returns it * * @return {@link DataSource} */ @Bean(name = "datasource") public DataSource dataSource() { JndiDataSourceLookup dsLookup = new JndiDataSourceLookup(); dsLookup.setResourceRef(true); return dsLookup.getDataSource(environment.getRequiredProperty("jndi.datasource")); } /** * Creates and returns the MyBatis SqlSessionFactoryBean * * @return SqlSessionFactoryBean * @throws Exception */ @Bean public SqlSessionFactoryBean sqlSessionFactory() throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource()); sessionFactory.setTypeAliasesPackage("org.app.researchportal.core.domain"); return sessionFactory; } /** * creates the AtomikosTransactionManager bean for JTA transactions * * @return UserTransactionManager */ @Bean(name="AtomikosTransactionManager", initMethod = "init", destroyMethod = "close") public UserTransactionManager userTransactionManager() { UserTransactionManager userTransactionManager = new UserTransactionManager(); userTransactionManager.setForceShutdown(false); return userTransactionManager; } /** * create the UserTransaction bean for Atomikos JTA implementation * * @return UserTransactionImp * @throws SystemException */ @Bean(name = "AtomikosUserTransaction") public UserTransactionImp userTransactionImp() throws SystemException{ UserTransactionImp userTransactionImp = new UserTransactionImp(); userTransactionImp.setTransactionTimeout(300); return userTransactionImp; } /** * create the JtaTransactionManger bean to manage transactions * * @return JtaTransactionManager * @throws SystemException */ @Bean(name = "JtaTransactionManager") public JtaTransactionManager jtaTransactionManager() throws SystemException { JtaTransactionManager jtaTransactionManager = new JtaTransactionManager(); jtaTransactionManager.setTransactionManager(userTransactionManager()); jtaTransactionManager.setUserTransaction(userTransactionImp()); return jtaTransactionManager; } /** * creates Flyway bean to automatically handle database migrations * * @return Flyway */ @Bean(name = "flyway", initMethod = "migrate") public Flyway flyway() { Flyway flyway = new Flyway(); flyway.setDataSource(dataSource()); flyway.setOutOfOrder(false); flyway.setBaselineOnMigrate(true); flyway.setLocations("classpath:migrations"); return flyway; } }