13

My function will be triggered from an existing ServiceBus topic. I have created the function using the new tooling in VS2017 (15.3) preview, as a compiled function.

How can I test this function locally?

Janusz Nowak
  • 2,595
  • 1
  • 17
  • 36
Alf Kåre Lefdal
  • 643
  • 1
  • 6
  • 27
  • 1
    Press F5 and send a message to your service bus topic – Mikhail Shilkov Aug 29 '17 at 09:54
  • :-) Yes. I am aware of that possibility. But is there an easy way doing that in the context of the function? That is, reusing settings and maybe do it every time I start debugging? – Alf Kåre Lefdal Aug 29 '17 at 10:34
  • 1
    If you want it to add messages on startup you could consider adding an additional timer triggered function to your app that will automatically put messages onto the service bus on a short interval to facilitate debugging. – Jesse Carter Aug 29 '17 at 12:43
  • It's a triggered functions, so when you debug, it's expected that the function will be triggered by an event. In addition to the suggested options, another option is to drop a message on a queue using a tool (SBExplorer, ServiceBus360, Cloud Explorer, etc). – Sean Feldman Aug 29 '17 at 14:16

3 Answers3

26

For a non-http triggered function, you can send a POST request to the local administrator endpoint. More info here

like this (I am using Postman) enter image description here

TomTichy
  • 547
  • 5
  • 15
  • Teomat, have you successfully done this for a function triggered by a Service Bus message? I'm trying to do exactly this, and keep getting SerializationException's when my function calls BrokeredMessage#GetBody() to get the body of the message. – tones Oct 26 '17 at 03:15
  • 1
    Yeah, it worked. Don't serialize it yourself, the runtime will do that for you. Just include your string parameter in the Run function: Run([ServiceBusTrigger("queuename",......)]string Info, TraceWriter log) – TomTichy Oct 26 '17 at 15:40
  • 4
    Thanks! I needed to do some additional actions to make it work: 1) to change trigger signature accepting `string msg` instead of `Message msg`; 2) to do JSON escape for my test SB message like `{ "input": "{ \"testobj\": { \"testprop\": \"testval\"} }"` – Ivan Samygin Dec 30 '20 at 06:53
  • This should be the accepted answer. Saved me a lot of trouble. Thanks – Madhav Shenoy Jan 05 '21 at 22:22
  • @Ivan, you don't need to change signature, you can use Encoding.UTF8.GetString(message.Body) to get the data you posted. – Ali Oct 06 '21 at 01:35
2

If you want to check whether your function will be triggered by Azure Service Bus messages, you need to own a Azure Subscription and create a Service Bus namespace because Microsoft haven't provided Azure Service Bus emulator like Azure Storage emulator.

If you want to debug your function, you could create a new console application and invoke the function you defined. Steps below are for your reference.

Step 1, Create a Console Application.

Step 2, Add Project reference to the function project.

Step 3, Install Microsoft.Azure.WebJobs -Version 2.1.0-beta1 package from NuGet to your console application.

Install-Package Microsoft.Azure.WebJobs -Version 2.1.0-beta1 

Step 4, Use following code to invoke your function.

class Program
{
    static void Main(string[] args)
    {
        Function1.Run("msg1", new MyTraceWriter(TraceLevel.Info));
    }
}

public class MyTraceWriter : TraceWriter
{
    public MyTraceWriter(TraceLevel level) : base(level)
    {

    }

    public override void Trace(TraceEvent traceEvent)
    {
        Console.WriteLine(traceEvent.Message);
    }
}
superjos
  • 12,189
  • 6
  • 89
  • 134
Amor
  • 8,325
  • 2
  • 19
  • 21
1

You run the project in debug mode and create a JSON payload for the message then you can post a complete json object in this format.

{
    "input": "<trigger_input>"
}

for example

http://localhost:7071/admin/functions/OrderFunction

enter image description here

You can then read message in your function body and get the Json you posted.

Encoding.UTF8.GetString(message.Body)
Ali
  • 1,015
  • 14
  • 40