我有第一个项目“MyProject.Core”,我有EDMX:
回购集团:
class MyProjectRepo : IMyProjects
{
public int NumberOfUser()
{
return new context().User.Count();
}
public string HelloWorld()
{
return "Hello World!";
}
}
界面:
public interface IMyProjects
{
int NumberOfUser();
string HelloWorld();
}
工厂:
public static class MyProjectFactory
{
private static IMyProjects _returnedObject;
public static IMyProjects GetObject()
{
lock (typeof(MyProjectFactory))
{
_returnedObject = new MyProjectRepo();
}
return _returnedObject;
}
}
测试项目“”MyProject.Core.Tests“(测试通过):
[Test]
public void NumberOfUser_Test()
{
var number = MyProjectFactory.GetObject().NumberOfUser();
Assert.AreEqual(1, number);
}
[Test]
public void HelloWorld_Test()
{
var hello = MyProjectFactory.GetObject().HelloWorld();
Assert.AreEqual("Hello World!", hello);
}
我创建了一个“云”项目和一个WCFServiceWebRole。
在WCFServiceWebRole中,我有这个:
public class Service1 : IService1
{
public int NumberOfUser()
{
return MyProjectFactory.GetObject().NumberOfUser();
}
public string Hello()
{
return MyProjectFactory.GetObject().HelloWorld();
}
}
[ServiceContract]
public interface IService1
{
[OperationContract]
int NumberOfUser(string login, string password);
[OperationContract]
string Hello();
}
测试WCF的项目,方法“Hello”返回正确的值。 这是我遇到的另一种方法问题。在app.config中,我有这个 :
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://myproject.azurewebsites.net/Service1.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1"
contract="myprojectServiceAzure.IService1" name="BasicHttpBinding_IService1" />
</client>
错误:
System.TimeoutException:请求通道在00:00:59.7138476之后等待回复时超时。增加传递的超时值 调用Request或增加SendTimeout值 捆绑。 分配给此操作的时间可能是较长超时的一部分。 ----&GT; System.TimeoutException:对'http://MyProject.azurewebsites.net/Service1.svc'的HTTP请求已超出 分配超时00:00:59.9270000。分配给此的时间 操作可能是一部分 更长的超时。 ----&GT; System.Net.WebException:操作已超时 MyProject.Azure.Tests \ Service References \ MyProjectServiceAzure \ Reference.cs(487,0): MyProject.Azure.Tests.PointageServiceAzure.Service1Client.MyMethod(字符串 登录,字符串密码) MyProject.Azure.Tests \ AzureTests.cs(18,0):MyProject.Azure.Tests.AzureTests.Test()
答案 0 :(得分:0)
您是否检查过Azure防火墙规则?您需要“允许”WCF服务访问SQL Azure数据库。从内存中,您需要检查一个复选框,这允许托管应用程序访问数据库,因为默认情况下不会检查它。
答案 1 :(得分:0)
您是否尝试在web.config中设置MaxReceivedMessageSize等?
请参阅Here
答案 2 :(得分:0)
这不是你问题的答案。这是您面临的真正问题的解决方案:)
你并不是在编写单元测试,而是在进行集成测试。
你必须问问自己,你真正想要测试什么。据我所知,您正在测试与WCF服务的连接,而这不是为单元测试设计的。
我的建议是分离关注点。 WCF是唯一允许远程通信的代理。因此,它不是核心业务逻辑的一部分。您的业务逻辑应尽可能纯粹。没有不必要的依赖,可能很难摆脱。如果你必须用载体鸽子(;)替换WCF,逻辑不知道WCF你根本不需要触摸逻辑代码。
以下是我的想法的一个例子:
interface IService //pure business logic, no knowledge of WCF
{
double Add(double a, double b);
}
class NonWcfService : IService //pure business logic
{
public double Add(double a, double b)
{
return a + b;
}
}
[ServiceContract]
interface IServiceContract //wcf-bound (because of the attributes)
{
[OperationContract]
double Add(double a, double b);
}
class WcfService : IServiceContract //wcf-bound delegates calls to pure business logic
{
IService sourceService;
public WcfService(IService sourceService)
{
this.sourceService = sourceService;
}
public double Add(double a, double b)
{
return sourceService.Add(a,b);
}
}
现在,您可以编写NonWcfService的单元测试,而无需连接到任何服务。这意味着您的单元测试运行得更快。
您也可以为WcfService编写单元测试,以检查此包装器是否作为代理表现良好。