我有一个公开接口WCF数据服务:嘲讽WCF客户的IQueryable成员
public interface IAccountService
{
IQueryable<Account> Accounts { get; }
IQueryable<Contract> Contracts { get; }
}
[DataServiceKey("ID")]
public class Account
{
public virtual Guid ID { get; set; }
public virtual string AccountName { get; set; }
public virtual string Address1 { get; set; }
public virtual string Address2 { get; set; }
public virtual string City { get; set; }
public virtual string State { get; set; }
public virtual string Zip { get; set; }
public virtual string Phone { get; set; }
public virtual string Fax { get; set; }
public virtual string Status { get; set; }
public virtual DateTime StartDate { get; set; }
public virtual IEnumerable<Contract> Contracts { get; set; }
}
[DataServiceKey("ID")]
public class Contract
{
public virtual Guid ID { get; set; }
public virtual string ContractCode { get; set; }
public virtual string ContractName { get; set; }
public virtual DateTime StartDate { get; set; }
public virtual int UnitQty { get; set; }
public virtual double UnitPrice { get; set; }
}
我想嘲笑服务客户端进行单元测试。我想写出这样一个测试:
[Test]
public void MockContractsFromAccount()
{
var acctSvc = new Mock<IAccountService>();
var blah = new Contract[] { new Contract { ContractCode = "BLAH001", ContractName = "blah 1" },
new Contract { ContractCode = "BLAH002", ContractName = "blah 2" } };
var blee = new Contract[] { new Contract { ContractCode = "BLEE001", ContractName = "blee 1" } };
var accts = new Account[] { new Account { AccountName = "blah", State = "WY", Contracts = new DataServiceCollection<Contract>(blah) },
new Account { AccountName = "blee", State = "CO", Contracts = new DataServiceCollection<Contract>(blee) } };
acctSvc.SetupGet(x => x.Accounts).Returns(accts.AsQueryable());
var result = from x in acctSvc.Object.Accounts
where x.State == "CO"
select x;
Assert.That(result, Has.Count.EqualTo(1));
Assert.That(result.First().Contracts, Has.Count.EqualTo(2));
Assert.That(result, Is.All.EquivalentTo(blah));
}
但代码中的new DataServiceCollection<Contract>(blah)
失败,出现错误消息
SomeTests.MockContractsFromAccount: System.ArgumentException:该DataServiceContext到的DataServiceCollection实例所属的可能不确定。该DataServiceContext必须要么在构造函数中的DataServiceCollection提供或用于创建化DataServiceQuery或QueryOperationResponse对象,它是项目中的DataServiceCollection
源这似乎是越来越复杂。有没有办法让Visual Studio生成帐户&合同的接口或让accts.Contracts
返回IQueryable<Contract>
而不是DataServiceCollection<Contract>
?也许一些其他简单的解决方案来嘲笑这项服务?
为了清楚起见,svcutil.exe的是生成一个账户类,它看起来是这样的:
public class Account
{
public Guid ID { get; set; }
public string AccountName { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
public string Phone { get; set; }
public string Fax { get; set; }
public string Status { get; set; }
public DateTime StartDate { get; set; }
// It descends from IEnumerable<Contract>
public DataServiceCollection<Contract> Contracts { get; set; }
}
这似乎是一个不错的主意,但在生成的代码合同属性的类型DataServicesCollection的。如果我可以让VS生成一个IAccount接口,DataServicesCollection的确扩展IEnumerable 。我仍然没有看到让生成的代码实现接口 –
kelloti
2010-11-11 15:52:43
@kelloti的方法:不,它不是。 Dmytrii不喜欢我的答案,即使他和我的答案基本相同:他们基于这样一个事实,即Contracts属性是一个“IEnumerable”,至少是您向我们显示的代码。 –
rsenna
2010-11-11 17:39:52