[英]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.