public async Task<IHttpActionResult> Post(Empresa empresa)
        {
            if (empresa == null)
                return BadRequest("Empresa não pode ser nula");

            if (empresa.Id != 0)
                return BadRequest("Id da empresa inválido");

            try
            {
                await Task.FromResult(_repo.Salvar(empresa));

                //return CreatedAtRoute("DefaultApi", new { id = empresa.Id }, empresa);
                var location = Request == null ? "" :
                    string.Format("{0}/{1}", Request.RequestUri, empresa.Id).Replace("//", "/");

                return Created(location, empresa);

            }
            catch (Exception ex)
            {
                if (ex.InnerException != null && ex.InnerException.ToString().Contains("UQ_dbo.Empresa.CNPJ"))
                    return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Já existe uma empresa com este cnpj"));

                return InternalServerError(ex);
            }
        }
        public async Task<IHttpActionResult> Put(int id, Empresa empresa)
        {

            if (empresa == null)
                return BadRequest("Empresa não pode ser nula");

            if (id != empresa.Id)
                return BadRequest("Os id's não conferem");

            await Task.FromResult(_repo.Salvar(empresa));

            return StatusCode(HttpStatusCode.NoContent);
        }
        public Empresa Salvar(Empresa empresa)
        {
            if (empresa.Id == 0)
            {
                _ctx.Empresas.Add(empresa);
            }
            else
            {
                _ctx.Entry(empresa).State = EntityState.Modified;
            }

            SalvarContexto();
            return empresa;
        }
        public void Verificando_o_comportamento_do_método_Salvar_adicionando_empresa()
        {
            //arrange
            var id = 0;
            var empresa = new Empresa { Id = id, Nome = "teste de empresa", CNPJ = "10298199000122"};

            var mockRep = new Mock<IEmpresaRepositorio>();
            mockRep.Setup(mr => mr.Salvar(empresa)).Returns(() =>
            {
                empresa.Id = EmpresaStub.ObterEmpresas.Count + 1;
                return empresa;
            });

            //act
            var dado = mockRep.Object.Salvar(empresa);

            //assert
            Assert.AreNotEqual(id, dado.Id);
            Assert.AreEqual(empresa.Nome, dado.Nome);
            Assert.AreEqual(empresa.CNPJ, dado.CNPJ);
        }
        public Empresa Salvar(Empresa empresa)
        {
            if (empresa.Id == 0)
            {
                empresa.Id = _autoNum++;
                Empresas.Add(empresa);
            }
            else
            {
                var _emp = ObterPorId(empresa.Id);
                _emp = empresa;
            }

            return empresa;

        }
        public async Task Post_deverá_falhar_qdo_a_empresa_já_possuir_um_Id()
        {
            //Arrange
            var empresa = new Empresa { Id = 1, Nome = "Nova Empresa", CNPJ="12345000199"};
            var repo = new EmpresaRepositorioStub();
            var controller = new EmpresasController(repo);

            //Action
            var result = await controller.Post(empresa) as BadRequestErrorMessageResult;

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual("Id da empresa inválido", result.Message);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Post_deverá_adicionar_a_empresa_e_retornar_o_caminho_da_mesma()
        {
            //Arrange
            var empresa = new Empresa { Nome = "Nova Empresa",CNPJ="12345000177"};
            var repo = new EmpresaRepositorioStub();
            var controller = new EmpresasController(repo);

            //Action
            var result = await controller.Post(empresa) as CreatedNegotiatedContentResult<Empresa>;

            //Assert
            Assert.IsNotNull(result);
            //Assert.AreEqual(result.RouteName, "DefaultApi");
            //Assert.AreEqual(result.RouteValues["id"], result.Content.Id);
            Assert.AreEqual(result.Content.Nome, empresa.Nome);

            controller.Dispose();
            repo.Dispose();
        }