2

我有第一个项目“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 调用的超时值或增加 Binding 上的 SendTimeout 值。分配给此操作的时间可能是较长超时的一部分。----> System.TimeoutException:对“http://MyProject.azurewebsites.net/Service1.svc”的 HTTP 请求已超过分配的超时 00:00:59.9270000。分配给此操作的时间可能是较长超时的一部分。----> System.Net.WebException : 操作已超时 MyProject.Azure.Tests\Service References\MyProjectServiceAzure\Reference.cs(487, 0) : MyProject.Azure.Tests.PointageServiceAzure.Service1Client.MyMethod(String login ,

4

3 回答 3

0

您是否尝试在 web.config 中设置 MaxReceivedMessageSize 等?

这里

于 2012-12-28T15:05:07.727 回答
0

您是否检查过 Azure 防火墙规则?您需要“允许”WCF 服务访问 SQL Azure 数据库。从内存中,您需要选中一个复选框,它允许托管应用程序访问数据库,因为默认情况下不选中。

于 2012-12-28T11:31:36.667 回答
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 编写单元测试,以检查此包装器是否作为代理运行良好。

于 2012-12-29T16:27:47.027 回答