有没有办法让来自不同平台的Xamarin单元测试跑步者使用来自PCL的相同测试?

时间:2016-05-13 13:43:29

标签: android ios unit-testing xamarin nunit

假设我有一个跨平台的移动应用程序。它是在Xamarin框架中构建的,其架构看起来像这样(有点简化):

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

共享层包含所有业务逻辑,其他两个项目包含特定于平台的ui实现e.t.c。

我想使用单元测试来测试共享层。为此,我为iOS提供了两个测试运行器,例如iOS this one。两个测试运行者都使用NUnit框架。

单元测试在一个单独的PCL中,它也使用NUnit。

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

我花了一段时间在网上看,但没有找到太多相关内容。

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

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

'\0'

包含测试的PCL:

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

iOS亚军类:

[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);
    }
}

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

这个问题的目的只是为了知道是否可以使用平台特定的跑步者而不需要两套相同的测试。

另外,如果你有不同的方式,我会对此持开放态度。

提前致谢!

2 个答案:

答案 0 :(得分:0)

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

首先:您希望用于托管测试的可移植类库无法引用共享项目。换句话说:您无法在PCL中测试Logic类。那是一个盲目的结局。

第二:你写的是关于你想要测试的业务逻辑的全部内容。如果该业务逻辑没有耦合到UI,否则这将远非理想,您可以轻松地将其放入PCL并在您喜欢的任何测试运行器上运行测试。您不必在您正在构建的平台上运行它,因为它是便携式

最简单,最灵活的方法是添加功能齐全的.NET / Mono类库项目,引用nunit和business-logic-PCL项目,并使用IDE的测试运行器运行测试(Xamarin) Studio或Visual Studio,并不重要。)

如果您确实需要某些特定于平台的内容或您未受到PCL配置文件支持的内容,则可以轻松注入。

我们假设你想对时区做些什么,而PCL则不支持它。在您的PCL中添加ITimeZone界面,在Android和iOS应用共享项目中实现它,并在运行时将实现注入您的逻辑(手动或您喜欢的任何库,我建议ninject)。

答案 1 :(得分:0)

在做了进一步的研究后,它有可能,但我找到了一种更简单的方法,具有更多的优势。我最初的问题(不想在两个地方使用相同的代码)的解决方案是使用共享项目。然后你可以在跑步项目中引用它,你的所有测试都将显示在那里。

使用它的另一个好处是你也可以使用编译器指令(#if __IOS__的#if __ANDROID__)将代码放在那里需要一些特定于平台的功能:

#if __IOS__
using IOSApp;
#endif

#if __ANDROID__
using AndroidApp;
#endif

有关共享项目的信息,请访问:Xamarin shared projects guide