如何在单元测试中获得windows phone设备ID

本文关键字:windows phone 设备 ID 单元测试 | 更新日期: 2023-09-27 18:08:11

如何在windows phone单元测试中获得设备ID ?

我读了这个,但是它不适合我。

在我的应用程序中,我使用这个方法,它在这种情况下工作;但在单元测试中,它不起作用,失败的Exception: System。UnauthorizedAccessException: Access is denied.

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

    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";
        }
    }

如何在单元测试中获得windows phone设备ID

您甚至不应该尝试在单元测试中获取设备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传递给构造函数,使每个需要设备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...
}

这允许您单独测试Foo,独立于实际的DeviceIdProvider类。

请注意,您可以使用模拟库,例如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...
}