【问题标题】:Is there a way to have Xamarin unit test runners from different platforms use the same tests from a PCL?有没有办法让来自不同平台的 Xamarin 单元测试运行器使用来自 PCL 的相同测试?
【发布时间】:2016-05-13 13:43:28
【问题描述】:

假设我有一个跨平台的移动应用。它构建在 Xamarin 框架中,其架构如下所示(有些简化):

  • iOS 项目
  • Android 项目
  • 包含逻辑的 PCL(共享层)

共享层包含所有业务逻辑,其他两个项目包含平台特定的 ui 实现等

我想使用单元测试来测试共享层。为此,我为这两个操作系统添加了两个测试运行程序,例如用于 iOS 的this one。两个测试运行器都使用 NUnit 框架。

单元测试位于一个单独的 PCL 中,该 PCL 也使用 NUnit。

现在我的问题是:有没有办法让两个跑步者都使用这个 PCL 的测试,以便将测试保存在一个地方?

我在网上查了一段时间,但没有找到太多相关信息。

下面我试图说明我想要实现的目标:

共享项目中包含需要测试的逻辑的类:

public class Logic
{
    // The method to test
    public int add(foo, bar)
    {
        return (foo + bar);
    }
}

包含测试的 PCL:

[TestFixture]
public class SharedTest
{
    public void RunAll()
    {
        // Some magic code that runs all the below tests..
    }

    [Test]
    Add() {
        logic = new Logic();
        Assert.AreEqual(logic.add(1, 1), 2);
    }
}

iOS runner 类:

[TestFixture]
public class LogicTest
{
    SharedTest st = new SharedTest();

    [Test]
    st.RunAll();
}

旁注:我知道可以只从 PCL 运行测试并在必要时模拟一些特定于平台的功能,但我的老板更喜欢使用没有模拟的运行器。

这个问题的目的只是想知道是否可以在没有两组相同测试的情况下使用特定于平台的运行器。

另外,如果你有不同的方式,我愿意接受。

提前致谢!

【问题讨论】:

    标签: android ios unit-testing xamarin nunit


    【解决方案1】:

    我不确定我是否正确理解您的计划,但让我试一试。

    首先:要用于托管测试的可移植类库不能引用共享项目。换句话说:你不能在 PCL 中测试你的逻辑类。这是一个盲目的结局。

    第二:你写的都是关于你想要测试的业务逻辑。如果该业务逻辑未与 UI 耦合,否则这将远非理想,您可以轻松地将其放入 PCL 并在您想要的任何测试运行器上运行您的测试。您不必在要构建的平台上运行它,因为它是可移植的

    最简单、最灵活的方法是添加一个功能齐全的 .NET/Mono 类库项目、引用 nunit 和您的业务逻辑 PCL 项目,并使用 IDE 的测试运行程序(Xamarin Studio 或 Visual Studio,没关系)。

    如果您确实需要某些特定于平台的东西或您绑定的 PCL 配置文件不支持的东西,您可以轻松地注入它。

    假设您想在 PCL 中不支持时区的情况下做某事。在您的 PCL 中添加 ITimeZone 接口,在您的 Android 和 iOS 应用程序共享项目中实现它,并在运行时将实现注入您的逻辑(手动或您喜欢的任何库,我建议ninject)。

    【讨论】:

    • 我意识到我的问题有点含糊。不过,PCL 中的测试已经开始工作了。我想我没有正确解释这种情况。逻辑已经在 PCL 中,我已经可以(并且已经)使用单元测试 PCL 对其进行测试。我的老板只是更喜欢在特定于平台的运行器上运行它们,即使测试已经在此设置中运行。所以我现在要解决的问题是那些特定于平台的运行程序似乎需要他们自己的测试类,这迫使我进行两组相同的测试。
    【解决方案2】:

    经过进一步的研究,这可能是可行的,但我发现了一种更简单、更有优势的方法。我最初的问题(不希望在两个地方使用相同的代码)的解决方案是使用共享项目。然后您可以在运行器项目中引用它,您的所有测试都将显示在那里。

    使用它的另一个好处是您还可以使用编译器指令(#if __IOS__ 的#if __ANDROID__)将需要某些平台特定功能的代码放入其中:

    #if __IOS__
    using IOSApp;
    #endif
    
    #if __ANDROID__
    using AndroidApp;
    #endif
    

    有关共享项目的信息可以在这里找到:Xamarin shared projects guide

    【讨论】:

      猜你喜欢
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多