我正在使用jest在我的ReactJS应用程序中编写测试.到目前为止,要运行我的测试套件,我需要输入'npm test'.
这是package.npm的片段:
"scripts": {
"test": "./node_modules/.bin/jest",
(other stuff)
},
"jest": {
"unmockedModulePathPatterns": ["<rootDir>/node_modules/react"],
"scriptPreprocessor": "<rootDir>/node_modules/babel-jest",
"testFileExtensions": [
"es6",
"js"
],
"moduleFileExtensions": [
"js",
"json",
"es6"
]
},
Run Code Online (Sandbox Code Playgroud)
是否可以直接在我的IDE(IDEA/WebStorm)中运行这些测试,保留配置?我不是一个js家伙,但是例如WebStrom与Karma完美搭配.jest-cli也不应该这样吗?
为简单起见,假设我想将apache验证器中的EmailValidator注入我的活动中:
public class MainActivity extends FragmentActivity {
@Inject
EmailValidator emailValidator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
Run Code Online (Sandbox Code Playgroud)
我有一个MainModule类:
@Module
public class MainModule {
@Provides
public EmailValidator providesEmailValidator() {
return EmailValidator.getInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
和MainComponent接口:
@Singleton
@Component(modules = MainModule.class)
public interface MainComponent {
EmailValidator getEmailValidator();
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在活动中使用我的验证器时,我得到一个nullpointer异常:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean org.apache.commons.validator.routines.EmailValidator.isValid(java.lang.String)' on a null object reference
Run Code Online (Sandbox Code Playgroud)
显然我错过了一些东西.我知道匕首为我创建了组件实现.我应该用吗?怎么样?
如果我在onCreate方法中执行以下操作:
emailValidator = Dagger_MainComponent.create().getEmailValidator();
Run Code Online (Sandbox Code Playgroud)
一切正常.
但我希望能够在任何地方使用@Inject注释(可能在setter/constructor而不是字段).
我错过了什么?
我用dagger1做了类似的事情并且它起作用了.当然我需要打电话给ObjecGraph.inject(this)活动.什么是dagger2等同物?
编辑:
好的,所以我找到了解决方案.如果有人会有这样的问题,有一些片段:
1)我创建了一个应用程序类:
public class EmailSenderApplication extends Application { …Run Code Online (Sandbox Code Playgroud) 我的项目中有很多值对象.
我正在使用项目lombok来消除一些样板,所以我的值对象看起来像下面这样:
@Value
@Accessors(fluent = true)
public class ValueObject {
private final String firstProp;
private final int secondProp;
}
Run Code Online (Sandbox Code Playgroud)
不错,几乎没有样板.
现在,我在测试中经常使用all-args构造函数.它看起来很乱,所以我想我会介绍Builder Pattern变种:
public class ValueObjectBuilder {
private static final int DEFAULT_VALUE_FOR_SECOND_PROP = 666;
private String firstProp = "default value for first prop;
private int secondProp = DEFAULT_VALUE_FOR_SECOND_PROP;
private ValueObjectBuilder() {}
public static ValueObjectBuilder newValueObject() {
return new ValueObjectBuilder();
}
public ValueObjectBuilder withFirstProp(String firstProp) {
this.firstProp = firstProp
return this;
}
public ValueObjectBuilder withFirstProp(int secondProp) {
this.secondProp = secondProp;
return this; …Run Code Online (Sandbox Code Playgroud) 在我的类似教程的应用程序中,我有一个AddForm组件:
var React = require('react');
var Input = require('react-bootstrap').Input;
var TeamActions = require('../actions/team_actions.js');
var AddForm = React.createClass({
handleFormSubmit: function(e) {
e.preventDefault();
var name = this._trimmedValue(this.refs.name);
var rating = this._trimmedValue(this.refs.rating);
if (name && rating) {
TeamActions.addTeam(
{name: name, rating: rating}
);
this._clearField(this.refs.name);
this._clearField(this.refs.rating);
}
},
_trimmedValue: function(field) {
return field.getInputDOMNode().value.trim();
},
_clearField: function(field) {
field.getInputDOMNode().value = '';
},
render: function() {
return (
<form onSubmit={this.handleFormSubmit}>
<Input label="Name" type="text" placeholder="Name" ref="name" />
<Input label="Rating" type="text" placeholder="Rating" ref="rating" />
<Input bsStyle="primary" …Run Code Online (Sandbox Code Playgroud) 我正在努力了解Flux和Reactjs.
考虑以下非常简单的场景:
你有一个输入很少的表格.当用户提交表单时,
ActionCreator.publishAnnouncement(this.state.announcement);
Run Code Online (Sandbox Code Playgroud)
在我的表单组件中调用.这是publishAnnouncement方法的样子:
var publishAnnouncement = function (announcement) {
AnnouncementAPI.publishAnnouncement(
announcement,
successCallback,
failureCallback
)
};
Run Code Online (Sandbox Code Playgroud)
AnnouncementAPI只是一个AJAX http POST调用的包装器.这需要两次回调 - 成功和失败.
现在:我需要在屏幕上显示通知/吐司 - 表示成功或失败. 你会怎么用Flux的方式做到这一点?
我正在考虑创建Notification组件并在我的表单中呈现它.如下:
<Notification title={this.state.notification.title} message={this.state.notification.title} visible={this.state.notification.visibility} // ?? onTimeExceeded ?? />
Run Code Online (Sandbox Code Playgroud)
但是我该如何处理这些回调呢?我应该创建监听ANNOUNCEMENT_PUBLISHING_SUCCEEDED和ANNOUNCEMENT_PUBLISHING_FAILED事件的NotificationStore吗?为了对这些事件做出反应,商店会发出CHANGE事件,从而更新我的通知.
但即使我这样做,我应该如何指示我的通知显示/隐藏?或者更糟糕的是,2秒后出现并隐藏?
我在GitHub上看到很少的组件,每个组件都使用refs等,我个人不喜欢.
总结一下: 你会如何实现这个?或许这样的项目存在?如果是这样,我在哪里可以找到它?
如何强制md-select在多种模式下表现得像
<select multiple required ... >
Run Code Online (Sandbox Code Playgroud)
?
这是小提琴,以显示我的意思.在此示例中,如果未从select标记中选择至少1个选项,则我的浏览器不允许我提交表单.
我希望md-select的行为类似,但我不知道我该怎么做 - 既没有'required'属性也没有添加'ng-require'指令有帮助.
假设你有一个模型Foo.一个业务案例是简单地创建一个Foo实例,因此我的模型中有一个相应的CreateFooCommand,通过调用给定REST端点的POST请求来触发.
当然还有其他命令.
但现在,有一个ViewModel,它来自我的DomainModel.它只是一个带有原始数据的sql表 - 来自DomainModel的每个Foo实例都有相应的派生ViewModel实例.两者都有不同的ID(在DomainModel上有一个DomainID,在ViewModel上它只是一个long值).
现在:在这种情况下我是否应该关心HATEOAS?在适当的REST实现中,我至少应该在标头中返回location-url.但由于我的视图模型仅来自DomainModel,我应该关心吗?在创建DomainModel时,我甚至没有视图模型的ID.
假设我有这样的模型:
class Foo(models.Model):
name = models.CharField(max_length=50)
year = models.IntegerField(max_length=4)
some_value = models.IntegerField(default=0)
Run Code Online (Sandbox Code Playgroud)
和
class Bar(models.Model)
name = models.CharField(max_length=50)
foo = models.ForeignKey(Foo)
Run Code Online (Sandbox Code Playgroud)
然后我使用FooAdmin类在django AdminSite中注册我的模型:
class FooAdmin(admin.ModelAdmin):
list_display = ['name', 'year', 'some_value']
Run Code Online (Sandbox Code Playgroud)
它运行正常,但由于某种原因,我需要为我的管理站点中的每个Foo行添加两个按钮.假设我称之为'Related_button'和'Action_button'
我需要这些按钮位于每一行并且行为如下:
- 当用户点击'Related_button'时,他被重定向到django管理站点,其中列出了与特定Foo对象相关的所有Bars
- 当用户点击'Action_button'时,类Foo的对象中的字段some_value被设置为自定义值,假设为15.但在此之前,确认弹出窗口(是否确定?是/否)应该出现.
怎么做?我发现我可以做类似的事情:
def button(self, obj):
return '''<input type="button" value="button" />'''
button.short_description = 'Action'
button.allow_tags = True
list_display = ['name', 'year', 'some_value', 'action']
Run Code Online (Sandbox Code Playgroud)
在我的FooAdmin中导致按钮出现在每一行中.但是如何为该按钮设置操作?
reactjs ×3
javascript ×2
jestjs ×2
android ×1
angularjs ×1
boilerplate ×1
builder ×1
cqrs ×1
dagger-2 ×1
django ×1
flux ×1
hateoas ×1
html ×1
java ×1
lombok ×1
python ×1
reactjs-flux ×1
rest ×1
unit-testing ×1
webstorm ×1