小编Kla*_*ein的帖子

Android自定义视图和自定义Attr的双向数据绑定

我一直在为基本应用程序使用双向数据绑定,它很顺利,直到我开始使用自定义视图和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)

android android-layout android-databinding

7
推荐指数
1
解决办法
4480
查看次数

Rust 中的单元测试、模拟和特征

我目前正在构建一个严重依赖文件 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)

tdd unit-testing mocking traits rust

5
推荐指数
2
解决办法
3654
查看次数