如何在单元测试中获得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";
}
}
您甚至不应该尝试在单元测试中获取设备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...
}