繁体   English   中英

如何在单元测试中获取Windows Phone设备ID

[英]How to get windows phone device ID in unit test

如何在Windows Phone单元测试中获取设备ID?

我读过这篇文章 ,但是对我来说不起作用。

在我的应用程序中,我正在使用这种方法,在这种情况下它可以工作; 但在单元测试中不起作用,失败并发生异常:System.UnauthorizedAccessException:访问被拒绝

有什么想法吗? 我的相关代码如下:

    private static string GetClientID() {
        string id = new Guid().ToString();
        object objUniqueID;
        if(DeviceExtendedProperties.TryGetValue("DeviceUniqueId", out objUniqueID)) {
            return ConvertEx.HexStringEncode((byte[])objUniqueID);
        }
        else {
            return "Unknown";
        }
    }

您甚至不应尝试在单元测试中获取设备ID,因为测试代码未在实际设备上运行。

相反,您应该使用封装设备ID检索的抽象,并注入伪造的实现进行测试。

例如,编写如下接口:

public interface IDeviceIdProvider
{
    string GetDeviceId();
}

在您的应用程序中,如下实现DeviceIdProvider:

class DeviceIdProvider : IDeviceIdProvider
{
    public string GetDeviceId()
    {
        object objUniqueID;
        if(DeviceExtendedProperties.TryGetValue("DeviceUniqueId", out objUniqueID)) {
            return ConvertEx.HexStringEncode((byte[])objUniqueID);
        }
        else {
            return "Unknown";
        }
    }
}

通过将其传递给构造函数,使每个需要设备ID的类都依赖IDeviceIdProvider

class Foo
{
    private readonly IDeviceIdProvider _deviceIdProvider;
    public Foo(IDeviceIdProvider deviceIdProvider)
    {
        _deviceIdProvider = deviceIdProvider;
    }

    public void DoSomething()
    {
        string deviceId = _deviceIdProvider.GetDeviceId();
        // do something with the device id
    }
}

...

var foo = new Foo(new DeviceIdProvider());

这称为依赖注入 您可以手动执行操作,也可以使用IoC容器(例如Unity,StructureMap,AutoFac,NInject等)。

在单元测试中,创建一个伪造的实现:

class FakeDeviceIdProvider : IDeviceIdProvider
{
    private string _deviceId = Guid.NewGuid().ToString();
    public string GetDeviceId()
    {
        return _deviceId;
    }
}

并将其传递给您需要测试的类,例如上例中的Foo

[Test]
public void Foo_Should_Do_Something()
{
    var deviceIdProvider = new FakeDeviceIdProvider();
    var foo = new Foo(deviceIdProvider);
    // test the behavior of Foo...
}

这使您可以独立于真实的DeviceIdProvider类单独测试Foo

请注意,可以使用模拟库(例如FakeItEasy)来代替手动创建IDeviceIdProvider的虚假实现:

[Test]
public void Foo_Should_Do_Something()
{
    var deviceIdProvider = A.Fake<IDeviceIdProvider>();
    A.CallTo(() => deviceIdProvider.GetDeviceId()).Returns("123456");
    var foo = new Foo(deviceIdProvider);
    // test the behavior of Foo...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM