我们的Web应用程序具有非常丰富的Javascript前端,具有大量自定义小部件,向导等。我们正在考虑将其中的一些(可能最终全部)迁移到TypeScript,主要是为了更轻松的好处重构/减少错误。
我们已经为小部件/客户端业务逻辑进行了JavaScript单元测试 - 我们通过Karma运行。目前我们的断言都使用YUI测试框架,但我们并不特别关注它。
由于我们将代码库移动到TypeScript,因此考虑在TypeScript中编写一些灯具似乎也是合理的(为了同样的好处)。另请注意,我们的TypeScript代码的JavaScript输出并不像我们手工编写的JavaScript代码那样友好,所以这是另一个原因(想要针对TypeScript编写测试)。
目前,我们的一些单元测试将会是#猴子补丁"询问被测代码的依赖关系。例如,我们可以用模拟对象替换浏览器的XmlHttpRequest对象,以便我们可以推断出我们的代码如何与真实的 XmlHttpRequest对象进行交互。
我们目前通过仅替换测试持续时间的依赖性来做到这一点,例如window.XmlHttpRequest = MyMockObject;
有没有人对这种做法有任何想法,特别是关于如何在TypeScript中实现它与JavaScript不同的想法?
请注意,我不是修改代码的粉丝,其唯一目的是使单元测试更容易(例如,要求依赖项始终注入而不是假设存在)。
答案 0 :(得分:1)
sinon库(具有TypeScript绑定)已经完成了这项工作,特别支持伪造XMLHttpRequest(和定时器)。在可能的情况下使用它似乎是最好的选择。
有许多方法可以解决TypeScript中的类型检查问题。
@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;
}
}