我一直在为基本应用程序使用双向数据绑定,它很顺利,直到我开始使用自定义视图和attrs.
我想创建一个自定义视图,有一个TextView和一个EditText,并在另一个布局中使用它:
<TextView
android:text="Holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tvTitle"
android:layout_weight="1" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="none"
android:text="Name"
android:ems="10"
android:id="@+id/etAnwser"
android:layout_weight="1" />
Run Code Online (Sandbox Code Playgroud)
我有它的自定义attr
<resources>
<declare-styleable name="form_item">
<attr name="tvTitle" format="string" />
<attr name="anwserHint" format="string" />
<attr name="anwserText" format="string" />
<attr name="android:enabled" />
</declare-styleable>
Run Code Online (Sandbox Code Playgroud)
在片段中,我执行以下操作:
<rhcloud.com.financialcontrol.tabutil.FormItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="@{state.get()}"
form_item:anwserText='@={expense.description}'
form_item:tvTitle="Description:" />
Run Code Online (Sandbox Code Playgroud)
它的单向数据绑定很好用,但无论我改变文本,他都不会在课堂上给我发回调
@InverseBindingMethods(value = {
@InverseBindingMethod(type = FormItem.class, attribute = "anwserText"),
})
public class FormItem extends LinearLayout {
private TextView tvTitle;
private EditText etAnwser;
public FormItem(@NonNull Context context) {
super(context);
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); …Run Code Online (Sandbox Code Playgroud) 我目前正在构建一个严重依赖文件 IO 的应用程序,所以很明显我的代码的很多部分都有File::open(file).
做一些集成测试没问题,我可以轻松设置文件夹来加载它所需的文件和场景。
问题出现在我想要进行单元测试和代码分支的任何地方。我知道有很多模拟库声称可以模拟,但我觉得我最大的问题是代码设计本身。
比方说,我会用任何面向对象的语言(示例中的 java)执行相同的代码,我可以编写一些接口,并且在测试中简单地覆盖我想要模拟的默认行为,设置 a fake ClientRepository,无论重新实现什么固定回报,或使用一些模拟框架,如 mockito。
public interface ClientRepository {
Client getClient(int id)
}
public class ClientRepositoryDB {
private ClientRepository repository;
//getters and setters
public Client getClientById(int id) {
Client client = repository.getClient(id);
//Some data manipulation and validation
}
}
Run Code Online (Sandbox Code Playgroud)
但是我无法在 Rust 中获得相同的结果,因为我们最终将数据与行为混合在一起。
在RefCell 文档中,有一个与我在 java 上给出的示例类似的示例。一些答案指向特征、clojures、条件编译
我们可能会在测试中带来一些场景,第一个是某些 mod.rs 中的公共功能
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct SomeData {
pub name: Option<String>,
pub address: Option<String>,
}
pub …Run Code Online (Sandbox Code Playgroud)